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