HashMap、LinkedHashMap和TreeMap之间的区别

24 浏览
0 Comments

HashMap、LinkedHashMap和TreeMap之间的区别

在Java中,HashMapLinkedHashMapTreeMap的区别是什么?

我看不到它们的输出上有任何区别,因为它们都有keySetvaluesHashtable是什么?

Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "java2s");
print(m1.keySet()); 
print(m1.values()); 
SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "java2s");
print(sm.keySet()); 
print(sm.values());
LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "java2s");
print(lm.keySet()); 
print(lm.values());

admin 更改状态以发布 2023年5月23日
0
0 Comments

所有三个类都实现了Map 接口,并提供了几乎相同的功能。最重要的差异是迭代条目的顺序:

  • HashMap 对迭代顺序没有任何保证。当添加新元素时,迭代顺序甚至会彻底改变。
  • TreeMap 将根据它们的compareTo() 方法(或外部提供的Comparator)对键的“自然排序”进行迭代。此外,它实现了SortedMap接口,该接口包含依赖于此排序顺序的方法。
  • LinkedHashMap 将按照将条目放入映射中的顺序进行迭代

“哈希表”是基于哈希的地图的通用名称。在Java API的上下文中,Hashtable是一个过时的类,它是在Java 1.1时代在集合框架不存在的时候使用的。不应再使用它,因为其API充斥着复制功能的过时方法,并且它的方法被同步了(这可能会降低性能并且一般上是无用的)。使用ConcurrentHashMap代替Hashtable。

0
0 Comments

我更喜欢视觉呈现:

属性 HashMap TreeMap LinkedHashMap
迭代顺序 无保证的顺序,但时间内保持不变 按照自然排序进行排序 插入顺序
获取/放置/删除/包含键 O(1) O(log(n)) O(1)
接口 Map NavigableMap,Map,SortedMap Map
空值/键 允许 仅允许值 允许
快速失败行为 无法保证迭代器的快速失败行为,在不同步的并发修改存在的情况下无法做出任何硬性保证 无法保证迭代器的快速失败行为,在不同步的并发修改存在的情况下无法做出任何硬性保证 无法保证迭代器的快速失败行为,在不同步的并发修改存在的情况下无法做出任何硬性保证
实现 红黑树 双向链接的桶
是否同步 实现未同步 实现未同步 实现未同步
0