java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java treeset与treemap

深入浅出 Java 有序集合:TreeSet 与 TreeMap实例详解

作者:我是一筐橙子

在Java中,TreeSet 和 TreeMap 都是基于红黑树实现的集合类,它们都实现了 NavigableSet 和 SortedMap 接口,提供了对元素的自然排序或自定义排序的支持,下面分别详细介绍这两个类,感兴趣的朋友一起看看吧

深入浅出 Java 有序集合:TreeSet 与 TreeMap 详解

在算法竞赛或高性能系统开发中,我们经常需要动态维护一组有序数据,例如实时排序、寻找最接近的数值或进行区间查询。在这种场景下,Java 集合框架中的 TreeSetTreeMap 便是不可或缺的“神兵利器”。

一、核心 API:寻找“邻居”的专家

TreeSet 和 TreeMap 最强大的地方在于它们提供的 Navigable 导航方法,这些方法在处理区间问题(如 Range Module)时效率极高:

方法功能描述找不到时返回
lower(e) / lowerKey(k)找到严格小于目标的最大元素null
floor(e) / floorKey(k)找到小于等于目标的最大元素null
ceiling(e) / ceilingKey(k)找到大于等于目标的最小元素null
higher(e) / higherKey(k)找到严格大于目标的最小元素null

此外,它们还支持高效的范围视图(Range Views),如 subMap()headMap()tailMap(),能在 O ( log ⁡ n ) O(\log n) O(logn) 时间内获取特定区间的数据视图。

找邻居的方法可能返回null,一定要注意判断,这里有一个小技巧:在判读离目标数最近的数时,我们可以先判断是否为空和是否有元素本身,这样如果floor返回为空,那最近的就是ceiling.

二、 TreeSet:唯一的有序集合

TreeSet 实现了 NavigableSet 接口,主要用于存储不重复的有序元素。

  1. 内部机制:TreeSet 实际上是基于 TreeMap 实现的。它在内部维护了一个 TreeMap 实例,将元素存储为该 Map 的 Key,而 Value 则使用一个统一的虚拟对象。
  2. 元素唯一性:它不允许存储重复元素。TreeSet 判断“重复”的标准不是 equals(),而是 compareTo()compare() 返回 0。
  3. Null 处理:Java 7 之后,TreeSet 不再支持存储 null 元素,否则会抛出 NullPointerException

三、 TreeMap:功能强大的有序映射

TreeMap 存储键值对(Key-Value pairs),并根据 Key 进行排序。

四、 核心底层:红黑树 (Red-Black Tree)

TreeSet 和 TreeMap 的核心竞争力在于它们的底层实现——红黑树。这是一种自平衡的二叉搜索树,具有以下关键特性:

五、 TreeSet/TreeMap vs HashMap/HashSet

特性TreeMap / TreeSetHashMap / HashSet
排序始终保持有序无序
性能O ( log ⁡ n ) O(\log n) O(logn)平均 O ( 1 ) O(1) O(1)
底层实现红黑树哈希表(数组+链表/红黑树)

六、 开发建议与避坑指南

  1. 哨兵技巧(Sentinel Values):在处理寻找“前驱”或“后继”的逻辑时,为避免频繁的 null 判断,可以预先向集合中插入“正负无穷大”作为哨兵值。
  2. 避免 NPE:当使用 floor()ceiling() 返回包装类(如 Integer)并直接拆箱给基本类型 int 时,如果返回值为 null,会触发空指针异常。
  3. 选择建议:如果你的应用场景只需要快速存取且不关心顺序,HashMap 是性能更好的选择。但如果你需要频繁进行范围搜索、寻找最接近的键或需要数据始终有序,请务必选择 TreeMap/TreeSet

到此这篇关于深入浅出 Java 有序集合:TreeSet 与 TreeMap实例详解的文章就介绍到这了,更多相关java treeset与treemap 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文