天天看點

HashMap, LinkedHashMap 和 TreeMap的差別

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