HashMap 和 TreeMap 的区别

2025年3月17日 | 阅读 3 分钟

Java 的 HashMapTreeMap 都是 Java 集合框架的类。Java Map 实现通常充当分桶哈希表。当桶变得太大时,它们会转换为 TreeNode 的节点,每个节点类似于 java.util.TreeMap 中的节点。

HashMap

HashMap 实现 Map<K, V>, CloneableSerializable 接口。它继承自 AbstractMap<K, V> 类。它属于 java.util 包。

  • HashMap 根据键存储值。
  • 它可以有一个 null 键和多个 null 值。
  • HashMap 在迭代时不会维护顺序。
  • 它包含唯一的元素。
  • 它基于哈希原理工作。

TreeMap

TreeMap 类继承自 AbstractMap<K, V> 类,并实现 NavigableMap<K, V >CloneableSerializable 接口。TreeMap 是 SortedMap 的一个例子。它由红黑树实现,这意味着键的顺序是排序的。

  • TreeMap 也根据键存储值。
  • TreeMap 按键排序。
  • 它包含唯一的元素。
  • 它不能有 null 键,但可以有多个 null 值。
  • 键按升序排列。
  • 它将对象存储在树结构中。

HashMap 和 TreeMap 之间的相似性

  • HashMapTreeMap 类都实现了 CloneableSerializable 接口。
  • 这两个类都继承自 AbstractMap<K, V> 类。
  • Map 是一个存储键值对的对象。在键值对中,每个键是唯一的,但其值可以是重复的。
  • 这两个类都表示从的映射。
  • 这两个 Map 都是非同步的。
  • Map 使用 put() 方法将元素添加到 Map 中。
  • 如果 Map 以任何方式被修改,迭代器将抛出 ConcurrentModificationException

HashMap 和 TreeMap 之间的主要区别是

HashMap 在迭代时不会保留顺序,而 TreeMap 通过使用 compareTo() 方法或在 TreeMap 的构造函数中设置的 comparator 来保留顺序。

下表描述了 HashMap 和 TreeMap 之间的区别。

基础HashMapTreeMap
定义Java HashMap 是 Map 接口的一种基于哈希表的实现。Java TreeMap 是 Map 接口的一种基于树结构的实现。
实现接口HashMap 实现 Map, CloneableSerializable 接口。TreeMap 实现 NavigableMap, CloneableSerializable 接口。
Null 键/值HashMap 允许一个 null 键和多个 null 值。TreeMap 不允许 null 键,但可以有多个 null 值。
同质/异质HashMap 允许异质元素,因为它不对键进行排序。TreeMap 由于排序而允许同质值作为键。
性能HashMap 比 TreeMap,因为它为 get() 和 put() 等基本操作提供了 O(1) 的常数时间性能。与 HashMap 相比,TreeMap较慢,因为它为 add()、remove() 和 contains() 等大多数操作提供了 O(log(n)) 的性能。
数据结构HashMap 类使用哈希表TreeMap 内部使用红黑树,这是一种自平衡二叉搜索树。
比较方法它使用 Object 类的 equals() 方法来比较键。Map 类的 equals() 方法重写了它。它使用 compareTo() 方法来比较键。
功能HashMap 类只包含基本的函数,如 get(), put(), KeySet() 等。TreeMap 类功能丰富,因为它包含函数:tailMap(), firstKey(), lastKey(), pollFirstEntry(), pollLastEntry()
元素顺序HashMap 不维护任何顺序。元素按自然顺序(升序)排序。
用途当不需要按排序顺序存储键值对时,应使用 HashMap。当需要按排序(升序)顺序存储键值对时,应使用 TreeMap。

HashMap vs TreeMap 示例

在下面的示例中,我们可以看到 HashMap 的元素是随机顺序的,而 TreeMap 的元素是按升序排列的。

输出

Difference between HashMap and TreeMap
下一个主题Java 教程