HashMap、LinkedHashMap和TreeMap之间的区别
HashMap、LinkedHashMap和TreeMap之间的区别
在Java中,HashMap
、LinkedHashMap
和TreeMap
的区别是什么?
我看不到它们的输出上有任何区别,因为它们都有keySet
和values
。Hashtable
是什么?
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日
所有三个类都实现了Map
接口,并提供了几乎相同的功能。最重要的差异是迭代条目的顺序:
HashMap
对迭代顺序没有任何保证。当添加新元素时,迭代顺序甚至会彻底改变。TreeMap
将根据它们的compareTo()
方法(或外部提供的Comparator
)对键的“自然排序”进行迭代。此外,它实现了SortedMap
接口,该接口包含依赖于此排序顺序的方法。LinkedHashMap
将按照将条目放入映射中的顺序进行迭代
“哈希表”是基于哈希的地图的通用名称。在Java API的上下文中,Hashtable
是一个过时的类,它是在Java 1.1时代在集合框架不存在的时候使用的。不应再使用它,因为其API充斥着复制功能的过时方法,并且它的方法被同步了(这可能会降低性能并且一般上是无用的)。使用ConcurrentHashMap代替Hashtable。
我更喜欢视觉呈现:
属性 | HashMap | TreeMap | LinkedHashMap |
---|---|---|---|
迭代顺序 | 无保证的顺序,但时间内保持不变 | 按照自然排序进行排序 | 插入顺序 |
获取/放置/删除/包含键 | O(1) | O(log(n)) | O(1) |
接口 | Map | NavigableMap,Map,SortedMap | Map |
空值/键 | 允许 | 仅允许值 | 允许 |
快速失败行为 | 无法保证迭代器的快速失败行为,在不同步的并发修改存在的情况下无法做出任何硬性保证 | 无法保证迭代器的快速失败行为,在不同步的并发修改存在的情况下无法做出任何硬性保证 | 无法保证迭代器的快速失败行为,在不同步的并发修改存在的情况下无法做出任何硬性保证 |
实现 | 桶 | 红黑树 | 双向链接的桶 |
是否同步 | 实现未同步 | 实现未同步 | 实现未同步 |