Java集合框架詳解之繼承map介面
趁著最近比較閒,靜下心來準備把關於集合框架的東西好好整理一下,邊學邊整理。近階段先是整理整體的知識點,一些介面,一些繼承類以及它們的特性,用法,後續還會有一些常用的,比較重要的類的jdk原始碼剖析。
map介面:
Map 提供 Key 到 Value 的對映,一個 Map 中不能包含相同的 Key,每個 Key 只能對映一個 Value。Map 介面提供 3 種集合的檢視,Map 的內容可以被當作一組 Key 集合,一組 Value 集合,或者一組 Key-Value 對映。
Map 提供的主要方法:
boolean equals(Object o) 比較物件;
boolean remove(Object o) 刪除一個物件;
put(Object key,Object value) 新增 key 和 value。
Hashtable:
Hashtable繼承了map介面,實現了一個基於key-value的Hash表,不能放入null鍵值對。舊HashMap的同步版本,新程式碼中也使用了HashMap。Hashtable是同步的,執行緒安全。
任何作為key的物件都要實現繼承自根object的hashcode和equals方法,通過key計算雜湊函式確定value的位置。兩個相同物件的hashcode必定相同,兩個hashcode相同未必相同物件,如果不同物件,即兩個物件通過雜湊函式都雜湊到同一位置,即衝突。避免相同物件出現不同hashcode,需要同時覆寫hashcode和equals方法。
Hashtable的使用:
Hashtable hashtable = new Hashtable(); String s1 = "hello"; String s2 = "abc"; String s3 = "edf"; hashtable.put("h", s1); //新增資料key-value hashtable.put("a", s2); hashtable.put("e", s3); System.out.println(hashtable.isEmpty()); //判斷是否為空 System.out.println(hashtable.get("a")); //通過key取value
Hashmap:
HashMap是最常用的map實現。和hashtable類似,但是執行緒不同步。允許null key和null value。
HashMap迭代子操作時間開銷和容量正比,因此初始容量設定小一點。
HashMap的使用:
HashMap hashMap= new HashMap();
String s1 = "hello";
String s2 = "abc";
String s3 = "edf";
hashMap.put("h",s1); //新增key-value,如果key存在,則覆蓋
hashMap.put("a",s2);
hashMap.put("e",s3);
hashMap.get("h"); //通過key獲取value
hashMap.containsKey("a"); //通過key查詢是否有該key-value對
hashMap.containsValue("abc");//通過value查詢是否有該key-value對
//keyset返回包含key的set集合,然後利用iterator訪問key
for(Iterator it = hashMap.keySet().iterator(); it.hasNext();){
String tmp = it.next().toString(); //使用iterator訪問元素的key
System.out.println(tmp + "--");
System.out.println(hashMap.get(tmp)); //使用iterator訪問元素的value
}
WeakHashMap:
這種Map通常用在資料快取中。它將鍵儲存在弱引用(WeakReference)中。如果沒有強引用指向鍵物件,這些鍵就可以被GC垃圾回收執行緒回收。值被儲存在強引用中,所以要確保沒有引用從值指向鍵或者將值也儲存在弱引用中
m.put(key, new WeakReference(value))
LinkedHashMap:
HashMap和LinkedList的結合,所有元素的插入順序儲存在LinkedList中。所以迭代LinkedHashMap的條目(entry)、鍵和值的時候總是遵循插入的順序。在JDK中,這是元素消耗記憶體最大的集合。
TreeMap:
一種基於已排序且帶導向資訊Map的紅黑樹。每次插入都會按照自然順序或者給定的比較器排序。這個Map需要實現equals方法和Comparable/Comparator。compareTo需要前後一致。這個類實現了一個NavigableMap介面:可以帶有與鍵數量不同的入口,可以得到鍵的上一個或者下一個入口,可以得到另一Map某一範圍的鍵(大致和SQL的BETWEEN運算子相同),TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
HashMap和hashtable比較
1)hashtable基於舊的dictionary類,HashMap基於jdk1.2新的map介面。
2)hashtable同步,執行緒安全;HashMap非同步,執行緒不安全,但是效率高。
3)hashtable不能新增null key和null value;HashMap可以新增null key和null value。
4)不需要執行緒安全,一般使用HashMap。
HashMap和treemap比較
1)HashMap使用hashcode對元素進行快速查詢,元素順序不固定;treemap元素順序通過key固定(實現了sortedmap),想要得到有序結果,使用treemap,linkedhashmap是基於元素進入集合的順序。
2)頻繁索引,新增,刪除元素使用HashMap,要求新增的鍵類明確定義了hashCode()和 equals()的實現。
3)二樹map一樣,但順序不一樣,導致hashCode()不一樣。在hashMap中,同樣的值的map,順序不同,equals時false;而在treeMap中,同樣的值的map,順序不同,equals時,true,說明,treeMap在equals()時是整理了順序了的。