Java TreeMap 类

2025年4月1日 | 阅读10分钟

Java TreeMap 类是一个基于红黑树的实现。它提供了将键值对以排序顺序存储的有效方法。

java.util 包包含 Java TreeMap 类,它是 Java 集合框架的组成部分。它扩展了 AbstractMap 类并实现了 NavigableMap 接口。TreeMap 是一个有效的基于红黑树的解决方案,可以对键值对进行排序。TreeMap 在需要有序键值对的情况下效果很好,因为它保持升序。它还只包含唯一的元素,确保每个键都对应一个唯一的值。尽管 TreeMap 不能有 null 键,但可以有多个 null 值。

Java TreeMap class hierarchy

Java TreeMap 类的要点是:

  • Java TreeMap 根据键存储值。它实现了 NavigableMap 接口并扩展了 AbstractMap 类。
  • Java TreeMap 包含唯一元素。
  • Java TreeMap 不能有 null 键,但可以有多个 null 值。
  • Java TreeMap 是非同步的。
  • Java TreeMap 保持升序。

TreeMap 类声明

让我们看看 java.util.TreeMap 类的声明。

TreeMap 类参数

让我们看看 java.util.TreeMap 类的参数。

  • K:这是此映射所维护的键的类型。
  • V:这是映射值的类型。

Java TreeMap 类的构造函数

构造函数描述
TreeMap()它用于构造一个空树映射,该映射将根据其键的自然顺序进行排序。
TreeMap(Comparator<? super K> comparator)它用于构造一个空基于树的映射,该映射将根据比较器 comp 进行排序。
TreeMap(Map<? extends K,? extends V> m)它用于使用 m 中的条目初始化 TreeMap,这些条目将根据键的自然顺序进行排序。
TreeMap(SortedMap<K,? extends V> m)它用于使用 SortedMap sm 中的条目初始化 TreeMap,并按与 sm 相同的顺序进行排序。
TreeMap(Collection<? extends K> c)它构造一个包含指定集合元素的树映射,并按其自然顺序进行排序。
TreeMap(SortedMap<K, ? extends V> m, Comparator<? super K> comparator)它使用提供的排序映射的条目初始化 TreeMap,并使用给定的比较器进行排序。

Java TreeMap 类的方法

方法描述
Map.Entry<K,V> ceilingEntry(K key)它返回键最小的键值对,该键大于或等于指定键,如果没有这样的键,则返回 null。
K ceilingKey(K key)它返回比指定键大的最小键,如果没有这样的键,则返回 null。
void clear()它从映射中删除所有键值对。
Object clone()它返回 TreeMap 实例的浅拷贝。
Comparator<? super K> comparator()它返回用于按顺序排列键的比较器,如果映射使用自然排序,则返回 null。
NavigableSet<K> descendingKeySet()它返回映射中键的降序 NavigableSet 视图。
NavigableMap<K,V> descendingMap()它以降序返回指定的键值对。
Map.EntryfirstEntry()它返回键最小的键值对。
Map.Entry<K,V> floorEntry(K key)它返回键最大的键值对,该键小于或等于指定键,如果没有这样的键,则返回 null。
void forEach(BiConsumer<? super K,? super V> action)对 Map 中的每个条目执行给定的操作,直到所有条目都被处理完毕或操作抛出异常。
SortedMap<K,V> headMap(K toKey)它返回键严格小于 toKey 的键值对。
NavigableMap<K,V> headMap(K toKey, boolean inclusive)它返回键小于(如果 inclusive 为 true,则小于或等于)toKey 的键值对。
Map.Entry<K,V> higherEntry(K key)它返回严格大于给定键的最小键,如果没有这样的键,则返回 null。
K higherKey(K key)它用于返回此映射是否包含指定键的映射。
SetkeySet()它返回映射中存在的键的集合。
Map.Entry<K,V> lastEntry()它返回键最大的键值对,如果没有这样的键,则返回 null。
Map.Entry<K,V> lowerEntry(K key)它返回一个键值映射,该映射与严格小于给定键的最大键相关联,如果没有这样的键,则返回 null。
K lowerKey(K key)它返回严格小于给定键的最大键,如果没有这样的键,则返回 null。
NavigableSet<K> navigableKeySet()它返回此映射中键的 NavigableSet 视图。
Map.Entry<K,V> pollFirstEntry()它移除并返回此映射中键最小的键值对,如果映射为空,则返回 null。
Map.Entry<K,V> pollLastEntry()它移除并返回此映射中键最大的键值对,如果映射为空,则返回 null。
V put(K key, V value)它将指定值与指定键插入到映射中。
void putAll(Map<? extends K,? extends V> map)它用于将一个映射中的所有键值对复制到另一个映射。
V replace(K key, V value)替换指定键的指定值。
boolean replace(K key, V oldValue, V newValue)为指定键替换旧值与新值。
void replaceAll(BiFunction<? super K,? super V,? extends V> function)通过调用给定的函数来替换每个条目的值,直到所有条目都被处理完毕或函数抛出异常。
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)它返回键范围从 fromKey 到 toKey 的键值对。
SortedMap<K,V> subMap(K fromKey, K toKey)它返回键范围从 fromKey(包含)到 toKey(不包含)的键值对。
SortedMap<K,V> tailMap(K fromKey)它返回键大于或等于 fromKey 的键值对。
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)它返回键大于(如果 inclusive 为 true,则大于或等于)fromKey 的键值对。
boolean containsKey(Object key)它返回此映射是否包含指定键的映射。
boolean containsValue(Object value)它返回此映射是否将一个或多个键映射到指定值。
K firstKey()它用于返回此排序映射中当前存在的第一个(最小)键。
V get(Object key)它用于返回此映射将指定键映射到的值。
K lastKey()它用于返回此排序映射中当前存在的最后一个(最大)键。
V remove(Object key)它从映射中移除指定键的键值对。
Set<Map.Entry<K,V>> entrySet()它返回映射中包含的映射的集合视图。
int size()它返回哈希表中存在的键值对的数量。
集合values()返回 Map 中包含的值的 collection 视图。

Java TreeMap 示例

文件名:TreeMap1.java

输出

100 Amit
101 Vijay
102 Ravi
103 Rahul

说明

此 Java 代码演示了如何存储键值对以及如何遍历 TreeMap 类的元素。最初,导入了 java.util.* 包,以便使用 TreeMap 类和其他相关实用程序。接下来,在 TreeMap1 类中生成了一个具有整数键和字符串值的 TreeMap 实例 map。使用 put() 方法向 TreeMap 添加了四个键值对。每个条目都包含一个与整数键对应的字符串值。

然后,使用 entrySet() 方法(该方法生成映射中条目的集合表示)通过 for-each 循环遍历 TreeMap 的条目。在循环内,使用 Map.Entry 接口的 getKey() 和 getValue() 方法访问每个条目,并将其键值对打印到控制台。

Java TreeMap 示例:remove()

文件名:TreeMap2.java

输出

Before invoking remove() method
100 Amit
101 Vijay
102 Ravi
103 Rahul
After invoking remove() method
100 Amit
101 Vijay
103 Rahul

说明

提供的 Java 代码展示了如何使用 remove() 方法删除条目,并使用 TreeMap 类存储键值对。TreeMap 首先使用键值对进行更新,这些键值对将整数键与匹配的字符串值关联起来。

然后,在调用 remove() 方法删除键为 102 的条目之前和之后,会报告 TreeMap 的内容。这是一个简短的代码片段,它演示了在 TreeMap 中添加、删除和遍历条目的基本功能,突出了其有序和可变性。

Java TreeMap 示例:NavigableMap

文件名:TreeMap3.java

输出

descendingMap: {103=Rahul, 102=Ravi, 101=Vijay, 100=Amit}
headMap: {100=Amit, 101=Vijay, 102=Ravi}
tailMap: {102=Ravi, 103=Rahul}
subMap: {101=Vijay, 102=Ravi}

说明

此 Java 代码通过使用 TreeMap 类和 NavigableMap 接口创建了一个根据键的升序保留键值对的映射。在向 TreeMap 添加整数键和关联的字符串值后,该代码演示了 NavigableMap 接口提供的多种导航功能。

除了显示 headMap()、tailMap() 和 subMap() 等方法(它们根据指定的键范围获取映射的子集)外,它还打印了降序映射,该映射反转了键值对的顺序。这些过程展示了 TreeMap 在根据各种标准对键值对进行分类和检索方面的适应性和功能。

Java TreeMap 示例:SortedMap

输出

headMap: {100=Amit, 101=Vijay}
tailMap: {102=Ravi, 103=Rahul}
subMap: {100=Amit, 101=Vijay}

说明

此 Java 代码使用 SortedMap 接口和 TreeMap 类来构造一个排序映射,其键值对根据键的自然顺序(在本例中为整数)进行排列。在用整数键和匹配的字符串值初始化 TreeMap 后,该代码使用 SortedMap 接口提供的各种方法根据指定的键范围获取映射的子集。

它特别强调了 headMap()、tailMap() 和 subMap() 函数,它们分别返回键小于、大于或等于以及存在于给定键之间的键值对。这些操作展示了 TreeMap 有效处理和检索排序键值对的能力。

HashMap 和 TreeMap 之间有什么区别?

HashMapTreeMap
HashMap 不保证元素的排序顺序。TreeMap 根据键的自然顺序或自定义比较器保证元素的排序顺序。
HashMap 在插入和检索操作方面通常更快,尤其是对于大型数据集。TreeMap 提供高效的范围查询和查找最近键等操作。
HashMap 使用哈希来存储键值对,对基本操作(例如 get、put、remove)提供平均恒定时间性能。TreeMap 内部使用红黑树,导致大多数操作的时间复杂度为对数级别,这使得它在基本操作方面比 HashMap 稍慢。
迭代 HashMap 中的元素不保证任何特定顺序。迭代 TreeMap 中的元素会根据键进行排序。
HashMap 允许 null 值,并且多个 null 值可以与不同的键关联。TreeMap 允许 null 值但不能有 null 键。
HashMap 未同步,因此不是线程安全的。TreeMap 未同步,因此不是线程安全的。
HashMap 是 java.util 包的一部分。TreeMap 是 java.util 包的一部分,并实现了 NavigableMap 接口。

Java TreeMap 示例:Book

文件名:MapExample.java

输出

1 Details:
101 Let us C Yashwant Kanetkar BPB 8
2 Details:
102 Data Communications & Networking Forouzan Mc Graw Hill 4
3 Details:
103 Operating System Galvin Wiley 6

说明

此 Java 代码演示了如何使用 TreeMap 存储和检索自定义类 Book 的对象。最初,Book 类定义了一个构造函数来初始化 id、name、author、publisher 和 quantity 属性。

MapExample 类的主函数中构造了一个名为“map”的 TreeMap 实例,其中包含整数键和 Book 对象作为值。使用它们各自的 id 作为键,构造并添加到 TreeMap 中三个 Book 对象。然后,代码通过 for-each 循环遍历 TreeMap 元素,迭代地提取键和关联的 Book 对象。


下一个主题Java Hashtable 类