
Paste_Image.png
Map概括
- Map 是“鍵值對”映射的抽象接口。
- AbstractMap 實現(xiàn)了Map中的絕大部分函數(shù)接口。它減少了“Map的實現(xiàn)類”的重復編碼。
- SortedMap 有序的“鍵值對”映射接口。
- NavigableMap 是繼承于SortedMap的,支持導航函數(shù)的接口。
- HashMap, Hashtable, TreeMap, WeakHashMap這4個類是“鍵值對”映射的實現(xiàn)類。它們各有區(qū)別!
- HashMap 是基于“拉鏈法”實現(xiàn)的散列表。一般用于單線程程序中。 對HashMap的同步處理可以使用Collections類提供的synchronizedMap靜態(tài)方法,或者直接使用JDK 5.0之后提供的java.util.concurrent包里的ConcurrentHashMap類。
- Hashtable 也是基于“拉鏈法”實現(xiàn)的散列表。它一般用于多線程程序中。
- WeakHashMap 也是基于“拉鏈法”實現(xiàn)的散列表,它一般也用于單線程程序中。相比HashMap,WeakHashMap中的鍵是“弱鍵”,當“弱鍵”被GC回收時,它對應的鍵值對也會被從WeakHashMap中刪除;而HashMap中的鍵是強鍵。
- TreeMap 是有序的散列表,它是通過紅黑樹實現(xiàn)的。它一般用于單線程中存儲有序的映射。
HashMap和Hashtable異同
HashMap和Hashtable的相同點
- HashMap和Hashtable都是存儲“鍵值對(key-value)”的散列表,而且都是采用拉鏈法實現(xiàn)的。
- 存儲的思想都是:通過table數(shù)組存儲,數(shù)組的每一個元素都是一個Entry;而一個Entry就是一個單向鏈表,Entry鏈表中的每一個節(jié)點就保存了key-value鍵值對數(shù)據(jù)。
HashMap和Hashtable的使用場景
最后再說說“HashMap和Hashtable”使用的情景。
其實,若了解它們之間的不同之處后,可以很容易的區(qū)分根據(jù)情況進行取舍。例如:
- 若在單線程中,我們往往會選擇HashMap;而在多線程中,則會選擇Hashtable。
- 若不能插入null元素,則選擇Hashtable;否則,可以選擇HashMap。
但這個不是絕對的標準。例如,在多線程中,我們可以自己對HashMap進行同步,也可以選擇ConcurrentHashMap。當HashMap和Hashtable都不能滿足自己的需求時,還可以考慮新定義一個類,繼承或重新實現(xiàn)散列表;當然,一般情況下是不需要的了。
HashMap和WeakHashMap異同
HashMap和WeakHashMap的相同點
- 它們都是散列表,存儲的是“鍵值對”映射。
- 它們都繼承于AbstractMap,并且實現(xiàn)Map基礎(chǔ)。
- 它們的構(gòu)造函數(shù)都一樣。它們都包括4個構(gòu)造函數(shù),而且函數(shù)的參數(shù)都一樣。
- 默認的容量大小是16,默認的加載因子是0.75。
- 它們的“鍵”和“值”都允許為null。
- 它們都是“非同步的”。
HashMap和WeakHashMap的不同點
- HashMap實現(xiàn)了Cloneable和Serializable接口,而WeakHashMap沒有。
- HashMap實現(xiàn)Cloneable,意味著它能通過clone()克隆自己。
- HashMap實現(xiàn)Serializable,意味著它支持序列化,能通過序列化去傳輸。
- HashMap的“鍵”是“強引用(StrongReference)”,而WeakHashMap的鍵是“弱引用(WeakReference)”。WeakReference的“弱鍵”能實現(xiàn)WeakReference對“鍵值對”的動態(tài)回收。當“弱鍵”不再被使用到時,GC會回收它,WeakReference也會將“弱鍵”對應的鍵值對刪除。這個“弱鍵”實現(xiàn)的動態(tài)回收“鍵值對”的原理呢?其實,通過WeakReference(弱引用)和ReferenceQueue(引用隊列)實現(xiàn)的。 首先,我們需要了解WeakHashMap中:
- 第一,“鍵”是WeakReference,即key是弱鍵。
- 第二,ReferenceQueue是一個引用隊列,它是和WeakHashMap聯(lián)合使用的。當弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關(guān)聯(lián)的引用隊列中。 WeakHashMap中的ReferenceQueue是queue。
- 第三,WeakHashMap是通過數(shù)組實現(xiàn)的,我們假設這個數(shù)組是table。