【JavaSE专栏54】Java集合类TreeMap解析,基于红黑树的键值对存储结构

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【JavaSE专栏54】Java集合类TreeMap解析,基于红黑树的键值对存储结构


一、什么是TreeMap

TreeMap 是 Java 中的一个有序映射类,实现了 SortedMap 接口,它是基于红黑树数据结构实现的,用于存储键值对,并根据键的自然顺序或指定的比较器进行排序,与 HashMap 不同,TreeMap 中的元素是按照键的顺序进行排列的。

TreeMap 的主要特点如下。

  1. 排序:TreeMap 中的键值对按照键的顺序进行排序,默认情况下按键的自然顺序排序,或者可以通过指定的 Comparator 来进行排序。
  2. 有序性:TreeMap 中的键值对是有序的,因此在遍历时可以按照排序顺序获取或操作元素。
  3. 动态更新:TreeMap 支持动态插入、删除和修改键值对操作,而且这些操作会保持元素的有序性。
  4. 支持范围查询:TreeMap 提供了一系列的方法来支持范围查询,例如 headMaptailMapsubMap 等,这些方法可以根据指定的范围获取子映射。

TreeMap 的应用场景包括以下 2 22 点。

  1. 排序需求:当需要按照键的顺序访问和处理数据时,可以使用 TreeMap 来存储键值对,并利用排序特性方便地进行相关操作。
  2. 范围查询:当需要根据键的范围来查询和操作数据时,可以利用 TreeMap 提供的范围查询方法来快速定位所需的子映射。

提示:由于 TreeMap 是基于红黑树实现的,其插入、删除和查找的时间复杂度为 O(logN),相对于 HashMap 的 O(1) 复杂度较高,因此在一些对性能要求较高的场景下可能需要权衡使用。


二、TreeMap类的使用

下面是使用 TreeMap 类的示例代码,请同学们复制到本地执行。

import java.util.TreeMap;
public class TreeMapExample {
    public static void main(String[] args) {
        // 创建一个TreeMap对象
        TreeMap<Integer, String> treeMap = new TreeMap<>();
        // 向TreeMap中添加键值对
        treeMap.put(3, "Apple");
        treeMap.put(1, "Banana");
        treeMap.put(2, "Orange");
        treeMap.put(4, "Mango");
        // 遍历TreeMap并输出键值对
        for (Integer key : treeMap.keySet()) {
            System.out.println("Key: " + key + ", Value: " + treeMap.get(key));
        }
        // 获取键最小的键值对
        System.out.println("First Entry: " + treeMap.firstEntry());
        // 获取键最大的键值对
        System.out.println("Last Entry: " + treeMap.lastEntry());
        // 获取小于等于给定键的最大键值对
        System.out.println("Floor Entry: " + treeMap.floorEntry(2));
        // 获取大于等于给定键的最小键值对
        System.out.println("Ceiling Entry: " + treeMap.ceilingEntry(3));
        // 删除指定键的键值对
        treeMap.remove(2);
        // 判断TreeMap是否包含指定键
        System.out.println("Contains Key 2: " + treeMap.containsKey(2));
    }
}

这个示例代码展示了使用 TreeMap 类的基本操作。首先创建了一个 TreeMap 对象,并使用 put() 方法向其中添加键值对。然后使用 keySet() 方法遍历 TreeMap 并输出键值对,使用 firstEntry()lastEntry() 方法获取最小和最大的键值对,使用 floorEntry()ceilingEntry() 方法获取小于等于给定键和大于等于给定键的键值对。最后使用 remove() 方法删除指定键的键值对,并使用 containsKey() 方法判断 TreeMap 是否包含指定键。

提示:TreeMap 中的键默认按照自然顺序排序,如果需要使用自定义的比较器来排序,可以在创建 TreeMap 对象时传入比较器。另外,TreeMap 同样是线程不安全的,如果需要在多线程环境下使用,可以考虑使用 ConcurrentSkipListMap 类。


三、TreeMap类的应用场景

TreeMap 类的应用场景包括以下 5 55 点,请同学们认真学习。

  1. 排序需求:当需要按照键的顺序访问和处理数据时,可以使用 TreeMap 来存储键值对,并利用排序特性方便地进行相关操作。例如,根据学生的分数进行排名、按照日期对事件进行排序等。
  2. 范围查询:TreeMap 提供了一系列的方法来支持范围查询,例如 headMaptailMapsubMap 等。这些方法可以根据指定的范围获取子映射。例如,根据日期范围查询某段时间内的事件。
  3. 时间轴数据存储:TreeMap 结构适合存储时间轴数据,因为时间是有序的。可以将时间作为键,事件或数据作为值,便于按照时间顺序进行检索和分析。
  4. 缓存实现:TreeMap 可以用于实现基于 LRU 算法的缓存。通过在 TreeMap 中存储键值对,并使用访问顺序作为键的比较器,实现缓存中最近访问的元素始终位于 Map 的最后。
  5. 数据统计和分析:由于 TreeMap 中的元素是有序的,可以根据键的顺序进行数据统计和分析。例如,可以统计某段时间内的数据变化趋势,找出数据的最大值和最小值等。


四、TreeMap面试题

  1. TreeMap 是什么?它与 HashMap 有什么区别?
  2. 如何在 TreeMap 中按照键的自然顺序进行排序?
  3. 如何在 TreeMap 中使用自定义比较器进行排序?
  4. TreeMap 的时间复杂度是多少?
  5. 如何获取 TreeMap 中的第一个键值对和最后一个键值对?
  6. 如何获取 TreeMap 中小于等于给定键的最大键值对?
  7. 如何判断 TreeMap 是否包含指定的键?
  8. TreeMap 是否线程安全?如果不是,如何处理多线程环境下的并发访问问题?
  9. TreeMap 的应用场景有哪些?
  10. 如何实现基于 LRU 算法的缓存使用 TreeMap?

五、总结

本文讲解了 Java 中集合类 TreeMap 的语法、使用说明和应用场景,并给出了样例代码。在下一篇博客中,将讲解 Java 中 HashTable 类的知识。


相关文章
|
8天前
|
XML JSON Java
Java中Log级别和解析
日志级别定义了日志信息的重要程度,从低到高依次为:TRACE(详细调试)、DEBUG(开发调试)、INFO(一般信息)、WARN(潜在问题)、ERROR(错误信息)和FATAL(严重错误)。开发人员可根据需要设置不同的日志级别,以控制日志输出量,避免影响性能或干扰问题排查。日志框架如Log4j 2由Logger、Appender和Layout组成,通过配置文件指定日志级别、输出目标和格式。
|
30天前
|
存储 Java 计算机视觉
Java二维数组的使用技巧与实例解析
本文详细介绍了Java中二维数组的使用方法
46 15
|
30天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
62 6
|
30天前
|
存储 算法 搜索推荐
【潜意识Java】期末考试可能考的高质量大题及答案解析
Java 期末考试大题整理:设计一个学生信息管理系统,涵盖面向对象编程、集合类、文件操作、异常处理和多线程等知识点。系统功能包括添加、查询、删除、显示所有学生信息、按成绩排序及文件存储。通过本题,考生可以巩固 Java 基础知识并掌握综合应用技能。代码解析详细,适合复习备考。
22 4
|
1月前
|
自然语言处理 数据处理 索引
mindspeed-llm源码解析(一)preprocess_data
mindspeed-llm是昇腾模型套件代码仓,原来叫"modelLink"。这篇文章带大家阅读一下数据处理脚本preprocess_data.py(基于1.0.0分支),数据处理是模型训练的第一步,经常会用到。
52 0
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
安全 搜索推荐 数据挖掘
陪玩系统源码开发流程解析,成品陪玩系统源码的优点
我们自主开发的多客陪玩系统源码,整合了市面上主流陪玩APP功能,支持二次开发。该系统适用于线上游戏陪玩、语音视频聊天、心理咨询等场景,提供用户注册管理、陪玩者资料库、预约匹配、实时通讯、支付结算、安全隐私保护、客户服务及数据分析等功能,打造综合性社交平台。随着互联网技术发展,陪玩系统正成为游戏爱好者的新宠,改变游戏体验并带来新的商业模式。
|
2月前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。

热门文章

最新文章

推荐镜像

更多