Java集合框架 -- 02 Map詳講

目錄導讀:
  • Map 概述
  • HashMap(線程不安全)
  • LinkedHashMap
  • Hashtable(線程安全)
  • Properties(可用于讀寫屬性文件,如ini文件)
  • TreeMap(類比于TreeSet)
  • WeakHashMap
  • IdentityHashMap
  • EnumMap
  • 各個Map實現類的性能分析
1.Map 概述
Map 保存的是鍵值對數據的集合,也被稱為字典,或關聯數組

Map類似于一個瓶子,因此,里面的元素不允許重復, 且無序的。

將Map的key-value中的key單獨拿出來看時,它們就是一個Set集合,故不可以重復
value單獨拿出來看時,它們類似一個List集合(可以重復,可以為null),只是索引不再是整數值,而是另一個對象key

注意:
    HashMap允許有一個null作為key
    Hastable不允許null做為其key和value

1.Map 集合的操作
由于是key-value,則操作時針對key和value的一些增、刪、判斷等

(1)增
    Object put(Object key, Object value); //添加一個key-value對,如Map中已存在key,則新的鍵值對會覆蓋原來的鍵值對,并返回被覆蓋的value
    void putAll(Map m); //將m中的鍵值對復制到本Map中
    
(2)刪
    void clear(); //刪除該Map對象中的所有key-value對
    Object remove(Object key); //刪除指定key所對應的鍵值對,并返回該鍵值對的值,若key不存在,則返回null
    boolean remove(Object key, Object value); //Java8新增的方法,刪除指定的key-value,

(3)判斷
    boolean containsKey(Object key); //判斷Map中是否有指定的key,有則返回true
    boolean containsValue(Object value); //判斷Map中是否包含一個或多個value
    boolean isEmpty(); //判斷該Map是否為空

(4)獲取
    Object get(Object key); //返回指定key所對應的value,若不包含該key則返回null      
    int size(); //返回Map里鍵值對的個數,即元素個數
    Set keySet(); //返回該Map中的所有key組成的Set集合
    Collection values(); //返回該Map里所有的value組成的Collection
    Set<Map.Entry<K,V>> entrySet(); //返回key-value對所組成的Set集合,每個集合元素都是Map.Entry對象
        注:Entry是Map對象的內部類,該類封裝了一個key-value對,Entry包含如下三個方法:
            1.Object getKey(); //返回Entry里包含的key值
            2.Object getValue(); //返回Entry里包含的value
            3.Object setValue(V value); //設置Entry里包含的value值,并返回新設置的value值
(5)遍歷
    就要借助上面的提到的方法,再結合foreach循環即可完成遍歷
    Set keySet(); //返回該Map中的所有key組成的Set集合
2.HashMap 和 Hashtable 實現類
它們都是Map接口的典型實現類,Hashtable是個古老的類(從名字里就可以看出的),線程安全

Hashtable和HashMap的區別?
1.Hashtable是線程安全,HashMap是線程不安全的,因此,HashMap的性能好一點。但對于多線程
情況下,Hashtable會更好。但為了達到線程安全,建議使用Collections工具類將HashMap包裝成線程安全的
2.Hashtable不允許null做為key和value,如果將null作為key或value放入Hashtable均會引
發java.lang.NullPointerException; HashMap則可以將null作為key或value存入, 且key只能有一個為null,
value可以有無數多個


為了成功的在Hashtable和HashMap中存儲、獲取對象,用作key的對象必須實現hashCode()和equals()方法(尤其是那些自定義的類)

Hashtable和HashMap判斷兩個key相等的標準是:兩個key通過equals()返回true,且hashCode()返回值也相等
Hashtable和HashMap判斷兩個value相等的標準是: 同equals()方法比較返回true即可
3.LinkedHashMap 實現類
是HashMap的子類,同LinkedHashSet一樣,也是雙向鏈表來維護key-value對的次序,

由于它是有序,如果添加元素時按順序添加,就可"排序"訪問,這就省去了用HashMap和Hashtable存儲后再進行排序的尷尬。

由于需要維護其插入順序,因此,性能略低與HashMap。但在迭代訪問Map里的全部元素時有較好的性能(因為內部是鏈表維護的順序)
4.Properties 類
是Hashtable的子類,用于處理屬性文件的。它在Map對象和屬性文件之間起橋梁作用
相關方法:
    String getProperty(String key); // 獲取Properties中指定屬性名對應的屬性值
    String getProperty(String key, String defaultValue); //與前面的方法類似,只是如果該key不存在,則返回該默認值defaultValue
    Object setProperty(String key, String value); //設置屬性值
    //讀寫屬性文件的方法
    void load(InputStream inStream); //從屬性文件中加載key-value對大Properties里
    void store(OutputStream out, String comments); //將Properties中的key-value輸出到指定的屬性文件中,comments是注釋次信息
5.TreeMap 實現類
·如同Set接口派生出了SortedSet接口一樣,Map接口也派生出了SortedMap接口,其實現類:TreeMap

·由于TreeMap具有排序性,因此在Map方法的基礎上增加了一些訪問第一個、最后一個、截取某部分等的方法
    如:
    Map.Entry firstEntry(); //返回該Map中最小的key對應的key-value對,若為空,返回null
    Object firstKey(); //返回Map中最小key值,如為空,返回null
    Map.Entry lastEntry(); 
    Object lastKey();
    SortedMap subMap(Object fromKey, Object toKey); //

·TreeMap同行TreeSet一樣也有兩種排序狀態:
    自然排序:   
    定制排序:
6.WeakHashMap 實現類
用法基本同HashMap,只是它的key保留了對實際對象的弱引用。而HashMap的key保留了對實際對象的強引用,
即只要該HashMap對象不被銷毀,該HashMap的所有key引用的對象就不會被垃圾回收,HashMap也不會自動刪除
這些key所對應的key-value對。而WeakHashMap對象的key所引用的對象如果沒有被其他變量強引用,則這些key
所引用的對象可能被垃圾回收,WeakHashMap也可能自動刪除這些key所對應的key-value對。

注意:
    1.不要讓WeakHashMap的key所引用的對象具有任何強飲用,否則將失去WeakHashMap的意義
        WeakHashMap whm = new WeakHashMap();
        whm.put("java", new String("200")); //具有強引用, "java"
        whm.put(new String("android"), new String("200")); //弱引用
7.IdentityHashMap 實現類
用法基本同HashMap,只是它在處理兩個key是否相等時等價嚴格:當且僅當 key1==key2 時,才認為它們相等
普通的HashMap則只要key1和key2通過equals()方法返回true,hashCode()值相等即可。
    
如:
    IdentityHashMap ith = new IdentityHashMap();
    ith.put(new String("java"), 78);
    ith.put(new String("java"), 45); //兩個均能添加進去,因為是new的,肯定不相等,便認為是兩個對象
    ith.put("android", 45);
    ith.put("android", 51); //只能存在一個(最后這個)
8.EnumMap 實現類
·添加的key-value對的key須是枚舉類的枚舉值。
·按枚舉類中的順序維護key的有序性
·不允許null作為key,否則引發NullPointerException異常;如果查詢是否包含null的key,或刪除值為null的key,都不會拋異常(盡管不會成功)
·內部以數組形式保存key-value,因此很高效,緊湊
9.各個Map實現類的性能分析
1.HashMap和Hashtable的實現機制幾乎一樣(都是基于hash算法),但Hashtable是一個古老、線程安全的類,因此
性能不如HashMap
2.TreeMap底層是基于紅黑樹實現,要維護key-value的有序性,因此性能不如HashMap和Hashtable。但它的key-value對
的有序性,使得在查找方面有優勢
3.LinkedHashMap底層因采用鏈表來維護有序性,因此它的性能不如HashMap。但它能保證有序性
4.EnumSet的實現性能最好,底層是基于數組實現的,但key只能是枚舉值
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容

  • 目錄 Collection、List、Set、Map概述CollectionMapHashMap的實現原理Tree...
    藍灰_q閱讀 530評論 0 2
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,731評論 18 399
  • 前面已經介紹完了Collection接口下的集合實現類,今天我們來介紹Map接口下的兩個重要的集合實現類HashM...
    Ruheng閱讀 10,477評論 2 38
  • Java SE 基礎: 封裝、繼承、多態 封裝: 概念:就是把對象的屬性和操作(或服務)結合為一個獨立的整體,并盡...
    Jayden_Cao閱讀 2,129評論 0 8
  • 相同點:都不能編輯 不同點: readonly可以觸發事件,能作用于text、password、textarea,...
    xiaolin_188閱讀 303評論 0 0