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