1. 程式人生 > >Java集合框架詳解之繼承map介面

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()時是整理了順序了的。