Map接口
Map
用於保存鍵值對(key-value),其中key不允許重複。Map接口的繼承樹如下:
可以看到,Map
的子類層次與Set
很像,Set
接口下有HashSet
,LinkedHashSet
,SorterdSet
,TreeSet
,EnumSet
;相應的,Map
接口下有HashMap
,LinkedHashMap
,SortedMap
,TreeMap
,EnumMap
。Map
的這些實現類中key集的存儲形式和對應的Set
中的元素的存儲形式完全相同。
實際上,從源碼看,Java是先實現了
Map
,然後通過包裝一個所有value都爲一個空對象的Map
就實現了Set
Java8改進的HashMap和Hashtable實現類
-
兩個實現類的區別:
Hashtable
是一個古老的實現類,雖然線程安全,但是性能較低;相對的,HashMap
線程不安全,但是性能較高Hashtable
不允許使用null
作爲key和value,而HashMap
中key和value都可以爲null
-
key對象的比較:兩個實現類判斷key相等的標準是,兩個key通過
equals()
方法比較返回true
,兩個key的哈希值也相等。即只要兩個key對象equals()
返回fasle
或者兩個對象的哈希值不同,那麼這兩個對象就能同時保存在同一個HashMap
中(Hashtable
也一樣)
所以在使用可變對象作爲key時要十分謹慎,因爲如果在存入Map後再修改key對象可能導致其哈希值的改變,從而
HashMap
無法準確訪問到該key
LinkedHashMap實現類
- 使用雙向鏈表維護了鍵值對的次序,則迭代順序與鍵值對的插入順序一致
- 迭代訪問時性能較好
SortedMap接口和TreeMap實現類
- 基本可以參照
SortedSet
接口和TreeSet
實現類
WeakHashMap
WeakHashMap
與HashMap
基本相似,區別在與HashMap
對於key保存的是強引用,而WeakHashMap
對key保留的只是弱引用。這就意味着只要HashMap
對象不被銷燬,其中所有的key所引用的對象也不會被垃圾回收;而在WeakHashMap
中的key所引用的對象如果沒有被其他強引用變量所引用,就有可能被垃圾回收,WeakHashMap
也會自動刪除對應的鍵值對。強弱引用可參考{% post_link jvm2-gc %}
IdentityHashMap實現類
IdentityHashMap
與HashMap
基本相似,區別在於只有當key1==key2
時,IdentityHashMap
才認爲兩個key是相等的。