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

简介: 【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 类的知识。


相关文章
|
6月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
279 4
|
6月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
333 5
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
335 1
|
6月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
465 1
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
509 2
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1270 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
523 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。