參考文獻:《Java瘋狂講義》(第三版)
Map集合
Map用于保存具有映射關系的數據,(key(不允許重復),value)
知識點:
Set與Map關系非常密切,雖然Map中放的元素是Key-Value對,Set集合中放的元素是單個對象,但如果把Key-Value對中的value當成是key的附庸:key在哪里,value就在哪里。
事實上,May提供了一個Entry內部類來封裝key-value,計算Entry存儲時則值考慮Entry封裝的key。從Java源碼來看Java是先實現了Map,然后通過包裝一個所有的value都為null的Map就實現了Set集合。
Hashtable與HashMap兩個典型區別:
1、Hashtable是一個線程安全的Map實現,但HashMap是一個線程不安全的實現,所以HashMap比Hashtable的性能高一點;但如果有多個線程訪問一個Map對象時,使用Hashtable實現類會更好。
2、Hashtable不允許使用null作為key和value,如果視圖把null值放進Hashtable中,將會引發NullPointerException異常:但HashMao可以使用null作為key或value。
知識點:
從Hashtable的類名上就可以看出它是一個古老的類,它的命名甚至沒有遵守Java的命名規范:每個單詞的首字母都應該大寫。也許當初開發Hashtable的工程師也沒有注意,后來大量的Java程序使用了Hashtable類,所以這個類名也就不能改為HashTable了,否則大量程序需要重寫。與Vector類似的是,盡量少用Hashtable實現類,即使需要創建線程安全的Map實現類,也無須使用Hashtable實行類,可以通過后面介紹的Collections工具類把HashMap編程線程安全的。
知識點:
為了成功在HashMap、Hashtable中存儲、獲取對象,用作key的對象必須實現hashCode()方法和equals()方法。
知識點:
當使用自定義類作為HashMap、Hashtable的key時,如果重寫該類的equals(Object obj)和hashCode()方法,則應該保證兩個方法的判斷標準一致——當兩個key通過equals()方法比較返回true時,兩個key的hashCode()返回值也應該相同。
因為HashMap、Hashtable保存key的方式與HashSet保存集合元素的方式完全相同,所以HashMap、Hashtable對key的要求與HashSet對集合元素的要求完全相同。
知識點:
與HashSet類似的是,盡量不要使用可變對象作為HashMap、Hashtable的key,如果確實需要使用可變對象作為HashMap、Hashtable的key,則盡量不要在程序中修改key的可變對象。
LinkedHashMap實現類
使用雙向鏈表維護key-value的次序(其實只要考慮key的次序),該鏈表負責維護Map的迭代順序,迭代順序與key-value對的插入順序保持一致。
Properties類
Properties類是Hashtable的子類。
該對象在處理屬性文件時特別方便(Windows操作平臺的ini文件就是一種屬性文件)。
Properties類可以把Map對象和屬性文件關聯起來,從而把Map對象中的key-value對寫入屬性文件中,也可以把屬性文件“屬性名=屬性值”加載到Map對象中。由于屬性文件里的屬性名、屬性值都是字符串,所以Properties里的key、value都是字符串。
SortedMap接口和TreeMap實現類
SortedMap接口也有一個TreeMap實現類,類似SortedSet、TreeSet;
注意:
再次強調:Set和Map的關系十分密切,Java源碼就是先實現了HashMap、TreeMap等集合,然后通過包裝一個所有的value都為null的Map集合實現了Set集合類。
WeakHashMap實現類:
WeakHashMap與HashMap的用法基本相似。
區別在于,HashMap的key保留了對實際對象的強引用,這就意味著只要該HashMap對象不被銷毀,該HashMap的所有key所引用的對象就不會被垃圾回收,HashMap也不會自動刪除這些key所對應的key-value對;但WeakHashMap的key只保留了對實際對象的弱引用,這意味著如果WeakHashMap對象的key所引用的對象沒有被其他強引用變量所引用,則這些key所引用的對象可能被垃圾回收,WeakHashMap也可能自動刪除這些key所對應的key-value對。
WeakHashMap的每個key對象只持有對實際對象的弱引用,因此當垃圾回收了該key所對應的實際對象之后,WeakHashMap會自動刪除該key對應的key-value對。
IdentityHashMap實現類
這個Map實現類的實現機制與HashMap基本相似,但它在處理兩個key相等時比較獨特:在IdentityHashMap中,當且僅當兩個key嚴格相等(key1==key2)時,IdentityHashMap才認為兩個key相等
知識點:
IdentityHashMap是一個特殊的實現類,此類實現Map接口時,它有意違反Map的通常規范:要求兩個key嚴格相等時才認為兩個key相等。
EnumMap實現類
EnumMap是一個與枚舉類一起使用的Map實現,EnumMap中的所有key必須是單個枚舉類的枚舉值。創建EnumMap時必須顯式或隱式地指定它對應的枚舉類。
特征:
1、EnumMap在內部以數組形式保存,所以這種實現形式非常緊湊、高效。
2、EnumMap根據key的自然順序來維護key-value對的順序。
3、EnumMap不允許使用null作為key,允許使用null作為value
各Map實現類性能分析:
HashMap和Hashtable的實現機制幾乎一樣,但由于Hashtable是一個古老的、線程安全的集合,因此HashMap通常比Hashtable要快。
TreeMap通常比HashMap、Hashtable要慢,因為TreeMap底層采用紅黑樹來管理key-value對。但是,TreeMap的key-value總是處于有序狀態。
對于一般場景,程序應該多考慮使用HashMap,因為HashMap正是為快速查詢設計的。但是如果程序需要一個總是排好序的Map時,則可以考慮使用TreeMap
LinkedHashMap比HashMap慢一點,因為它需要維護鏈表來保持Map中key-value的添加順序
IdentityHashMap性能沒有特別出色處,它采用與HashMap相似的實現,只是它使用==而不是equals()方法來判斷元素相等。EnumMap性能最好,它只能使用一個枚舉類的枚舉值作為key。
HashSet和HashMap、Hashtable的構造器允許指定一個負載極限,HashSet和HashMap、Hashtable的默認“負載極限”是0.75.