20170706 Map接口

參考文獻:《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.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容