HashMap与TreeMap之间的区别
Java HashMap</strong>和 TreeMap</strong>都是Java Collections 框架的类。 Java Map实现通常充当存储桶的哈希表。当存储桶太大时,它们将转换为 TreeNodes 的节点,每个节点的结构与 java.util.TreeMap</strong>中的节点类似。
HashMap</h2>
HashMap实现了 Map<K,V>,Cloneable 和 Serializable 接口。它扩展了 AbstractMap<K,V> 类。它属于 java.util 软件包。
HashMap包含基于键的值。
它可能只有一个null键和多个null值。
HashMap在迭代时不维护顺序。
它包含独特的元素。
它遵循哈希原理。
TreeMap</h2>
TreeMap类扩展了 AbstractMap<K,V> 类并实现了 NavigableMap<K,V>
, 可克隆和可序列化接口。 TreeMap是 SortedMap</strong>的示例。它由Red-Black树实现,这意味着键的顺序已排序。
TreeMap还包含基于键的值。
TreeMap按键排序。
它包含独特的元素。
它不能具有null键,但可以具有多个null值。
键按升序排列。
它将对象存储在树形结构中。
HashMap和TreeMap之间的相似之处
HashMap</strong>和 TreeMap</strong>类实现 Cloneable 和 Serializable 接口。
这两个类都扩展了 AbstractMap<K,V> 类。
Map是存储键值对的对象。在键值对中,每个键都是唯一的,但它们的值可能会重复。
两个类均表示从键到值的映射。
两个Map均未同步。
Map使用 put()方法在Map中添加元素。
如果Map以任何方式修改,则迭代器将引发 ConcurrentModificationException 。
HashMap和TreeMap之间的主要区别是:
HashMap</strong>不保留迭代顺序,而 TreeMap</strong>保留顺序通过使用 compareTo()方法或在TreeMap的构造函数中设置的比较器。
下表描述了HashMap和TreeMap之间的区别。>
HashMap</td>
| TreeMap</td>
|
Java HashMap</strong>是基于哈希表的Map接口实现。 |
Java TreeMap</strong>是Map接口的基于树结构的实现。 |
HashMap实现了 Map,Cloneable 和 Serializable 接口。 |
TreeMap实现了 NavigableMap,Cloneable 和 Serializable 接口。 |
HashMap允许单个空键和多个空值。 |
TreeMap不允许 null 键,但是可以具有多个 null值。 |
HashMap允许使用异构元素,因为它不对键执行排序。 |
由于排序,TreeMap允许将齐次值作为键。 |
HashMap比TreeMap<strong>更快,因为它为诸如get()和put()之类的基本操作提供的恒定时间性能为O(1)。 |
与HashMap相比, TreeMap的速度慢,因为它为大多数操作(如add(),remove()和contains())提供O(log(n))的性能。 |
HashMap类使用哈希表。 |
TreeMap在内部使用 Red-Black 树,这是一种自平衡二进制搜索树。 |
它使用 Object 类的 equals()方法比较键。 Map类的equals()方法将其覆盖。 |
它使用 compareTo()方法比较键。 |
HashMap类仅包含基本功能,例如 get(),put(),KeySet()等。 |
TreeMap类具有丰富的功能,因为它包含以下功能: tailMap(),firstKey(),lastKey(),pollFirstEntry(),pollLastEntry()。 |
HashMap不维护任何顺序。 |
元素以自然顺序(升序)排序。 |
当我们不需要按排序顺序的键值对时,应使用HashMap。 |
当我们需要按排序(升序)顺序排列的键值对时,应使用TreeMap。 |
HashMap与TreeMap的示例
在以下示例中,我们可以观察到HashMap的元素是随机顺序的,而TreeMap的元素是排列的升序。
import java.util.Map;
import java.util.HashMap;
import java.util.TreeMap;
public class HashMapVsTreeMapExample{
public static void main(String args[]){
Map<Integer, String> hm=new HashMap<Integer, String>();
hm.put(9, "Red");
hm.put(12, "Black");
hm.put(6, "Green");
hm.put(19, "White");
System.out.println("HashMap iteration Order:");
for(Map.Entry<Integer, String>entry: hm.entrySet()){
System.out.println(entry.getKey() + " = " +entry.getValue());
}
Map<Integer, String> tm=new TreeMap<Integer, String>();
tm.put(9, "Red");
tm.put(12, "Black");
tm.put(6, "Green");
tm.put(19, "White");
System.out.println("TreeMap iteration Order:");
for(Map.Entry<Integer, String>entry: tm.entrySet()){
System.out.println(entry.getKey() + " = " +entry.getValue());
}
}
}
输出: