概述:容器主要包括Collection和Map兩種,Collection存儲着單個對象的集合;而Map存儲着鍵值對(兩個對象key-->value)的映射表。
Collection、Set、List接口都屬於單值操作,每次只能操作一個對象;而Map接口與它們不同的是每次操作的都是一對對象,Map接口中的每個元素都是用“key-->value”的形式存儲在集合中。
一、Map接口繼承樹
說明:圖中的i:爲接口,c:爲類。
二、Map接口的常用子類
- HashMap:基於哈希表實現;無序存放的,是新的操作類,key不允許重複。
- Hashtable:和HashMap類似;無序存放,是舊的操作類,key不允許重複。但它是線程安全的,這意味着,同一時刻多個線程可以同時寫入HashTable並且不會導致數據不一致。它是遺留類,不應該去使用它。現在可以使用ConcurrentHashMap來支持線程安全,並且ConcurrentHashMap的效率會更高,因爲ConcurrentHashMap引入了分段鎖。
HashMap與Hashtable的區別
序號 |
比較點 |
HashMap |
Hashtable |
1 |
推出時間 |
JDK1.2之後推出,屬於新的操作類 |
JDK1.0時推出,屬於舊的操作類 |
2 |
性能 |
採用異步處理方式,性能更高 |
採用異步處理方式,性能較低 |
3 |
線程安全 |
屬於非線程安全的操作類 |
屬於線程安全的操作類 |
4 |
空鍵 |
允許將key設置爲null |
不允許將key設置爲null,否則將出現Null Pointer Exception異常 |
- TreeMap:基於紅黑樹實現;可以排序的Map集合,按集合中的key排序,key不允許重複。
- WeakHashMap:弱引用的Map集合,當集合中的某些內容不再使用時清除掉無用的數據,使用gc進行回收。
- IdentityHashMap:key可以重複的Map集合。
- LinkedHashMap:使用雙向鏈表來維護元素的順序,順序爲插入順序或者最近少使用(LRU)順序。
三、各種Map實現類選擇策略
1、正常情況使用HashMap,而不是Hashtable。
2、如果考慮排序,那麼考慮使用TreeMap。通常TreeMap比HashMap等在插入、刪除操作時要慢不少,因爲它需要在底層採用紅黑樹來管理key-value對。
3、如果考慮插入時的順序,那麼使用LinkedHashMap是個不錯的選擇。
4、如果想優化垃圾回收,建議使用WeakHashMap實現類(本文未提及);要求key完全匹配(同一對象),則使用IdentityHashMap;還有枚舉類不多說了。
5、關於null值:Hashtable不允許key爲null,也不允許value爲null;TreeMap與EnumMap不允許key爲null;HashMap及其子類LinkedHashMap,IdentityHashMap允許key爲null。