HashMap, LinkedHashMap 和 TreeMap的区别
Java里面的HashMap, LinkedHashMap 和 TreeMap 有什么区别?我看不出以下3个key和value有什么不同的。Hashtables里面又是怎么样的呢?
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());
回答一
所有这三个类都实现Map接口,并且提供功能大部分都是一样的。最重要的区别是通过entry进行迭代的顺序:
- HashMap完全不保证迭代的顺序。它可以完全改变元素添加的顺序
- TreeMap会根据 key的compareTo() 方法(或者是一个外部的比较器) 来实现一个自然顺序 进行迭代,另外他实现了SortedMap接口(含有依赖于这个排序顺序的方法)
- LinkedHashMap将会按entry插入map的顺序进行迭代
“Hashtable” 是 基于hash的映射的一个通用名字。在Java 的API里面,Hashtable是一个来自于Java1.1版本,在集合框架存在之前的已经过时的类了。他不应该再次被使用了,因为他的API里面充斥着各种过时的方法和重复的功能。并且他的方法是基于synchronized的(可能会降低性能并且通常来说是用不到的)。用ConcurrentHashMap去替代它吧。
回答二
这3个都是唯一的key到一个value的映射,故而都实现了map接口
-
HashMap是一个基于key的哈希映射。它支持 O(1) 时间复杂度的get/put操作。key一定要一致地实现hashCode() 和 equals()方法,这样才能使得HashMap可以正常工作。
-
LinkedHashMap和HashMap很像,但是它添加对于元素插入顺序的保存,所以他的迭代顺序是和插入顺序相同的(或者是访问顺序,取决于构造器的参数)
-
TreeMap是一种基于树的映射。它的put/get操作需要O(log n)的时间复杂度。它要求item的元的Comparable or Comparator有相同的比较机制。而它的迭代次序就是基于这个机制的。
文章翻译自Stack Overflow:https://stackoverflow.com/questions/2889777/difference-between-hashmap-linkedhashmap-and-treemap