JAVA 常用 Map

  • HashMap
  • ConcurrentHashMap
  • TreeMap
  • LinkedHashMap
  • WeakHashMap
  • IdentityHashMap

HashMap

http://www.reibang.com/p/fde06b74c1d4

ConcurrentHashMap

http://www.reibang.com/p/fde06b74c1d4

TreeMap

非哈希表刨晴,為紅黑樹結(jié)構(gòu),即平衡二叉排序樹垛玻。時(shí)間復(fù)雜度為 O(logN)
key 需要實(shí)現(xiàn) Comparable 接口

  • TreeSet 使用了 TreeMap
    // 二叉排序樹遍歷
    Comparable<? super K> k = (Comparable<? super K>) key;
    do {
        parent = t;
        cmp = k.compareTo(t.key);
        if (cmp < 0)
            t = t.left;
        else if (cmp > 0)
            t = t.right;
        else
            return t.setValue(value);   // 值相同則覆蓋并結(jié)束
    } while (t != null);
    
    // 新增節(jié)點(diǎn)
     Entry<K,V> e = new Entry<>(key, value, parent);
    if (cmp < 0)
        parent.left = e;
    else
        parent.right = e;
    
    // 平衡樹
    fixAfterInsertion(e);

LinkedHashMap

繼承自 HashMap 并重寫 HashMap 中的方法割捅,實(shí)現(xiàn)對(duì)鏈表的維護(hù)

  • LinkedHashSet 使用了 LinkedHashMap

   static class Entry<K,V> extends HashMap.Node<K,V> {
        Entry<K,V> before, after;
        Entry(int hash, K key, V value, Node<K,V> next) {
            super(hash, key, value, next);
        }
    }

    /**
     * The head (eldest) of the doubly linked list.
     */
    transient LinkedHashMap.Entry<K,V> head;

    /**
     * The tail (youngest) of the doubly linked list.
     */
    transient LinkedHashMap.Entry<K,V> tail;

WeakHashMap

Entry 繼承自 WeakReference,通過查詢 ReferenceQueue 移除被回收的 Entry
get帚桩、put亿驾、size 等方法均會(huì)觸發(fā)對(duì) ReferenceQueue 的查詢與移除 Entry

    
    private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> {
        
        // 新建 Entry 時(shí)指定 ReferenceQueue,JVM 回收時(shí)會(huì)將該對(duì)象放入 queue
        Entry(Object key, V value,
              ReferenceQueue<Object> queue,
              int hash, Entry<K,V> next) {
            super(key, queue);
            this.value = value;
            this.hash  = hash;
            this.next  = next;
        }       
    }

IdentityHashMap

判斷key值的相同账嚎,通過 == (即引用相同) 而非 equals
因此對(duì)于值相同但不同引用的 key莫瞬,均會(huì)保存

val map = new IdentityHashMap<Object, String>();

        val a = new Object();
        val b = new Object();

        map.put(a, "a");
        map.put(b, "b");

        assert map.get(a) == "a";
        assert map.get(b) == "b";

        val c = a;
        map.put(c, "c");

        assert map.get(c) == map.get(a);
        assert map.get(c) == "c";
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市郭蕉,隨后出現(xiàn)的幾起案子疼邀,更是在濱河造成了極大的恐慌,老刑警劉巖召锈,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旁振,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡涨岁,警方通過查閱死者的電腦和手機(jī)拐袜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梢薪,“玉大人蹬铺,你說我怎么就攤上這事”玻” “怎么了甜攀?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長琐馆。 經(jīng)常有香客問我规阀,道長,這世上最難降的妖魔是什么瘦麸? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任姥敛,我火速辦了婚禮,結(jié)果婚禮上瞎暑,老公的妹妹穿的比我還像新娘彤敛。我一直安慰自己,他們只是感情好了赌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布墨榄。 她就那樣靜靜地躺著,像睡著了一般勿她。 火紅的嫁衣襯著肌膚如雪袄秩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天逢并,我揣著相機(jī)與錄音之剧,去河邊找鬼邓尤。 笑死矫夯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的植兰。 我是一名探鬼主播玻蝌,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蟹肘,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了俯树?” 一聲冷哼從身側(cè)響起帘腹,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎许饿,沒想到半個(gè)月后阳欲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陋率,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年球化,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘贮。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赊窥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狸页,到底是詐尸還是另有隱情锨能,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布芍耘,位于F島的核電站址遇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏斋竞。R本人自食惡果不足惜倔约,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坝初。 院中可真熱鬧浸剩,春花似錦钾军、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至重罪,卻和暖如春樱哼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剿配。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工搅幅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呼胚。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓茄唐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砸讳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琢融,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 傳送門:Java(Android)數(shù)據(jù)結(jié)構(gòu)匯總 -- 總綱 簡(jiǎn)介 這篇主要來整理下基于Map接口實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)類。...
    sens_bingo閱讀 2,058評(píng)論 0 54
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 3,884評(píng)論 2 8
  • 引言: 在我初學(xué)java的時(shí)候甚至不知道有HashMap這個(gè)東西簿寂,所有的數(shù)據(jù)都是用Array進(jìn)行存儲(chǔ)漾抬,最多就使用一...
    WANGGGGG閱讀 1,439評(píng)論 0 1
  • Map Map集合介紹 ??Map(也稱為字典、關(guān)聯(lián)數(shù)組)是用于保存具有映射關(guān)系的數(shù)據(jù)常遂,保存兩組值纳令,key和val...
    Hughman閱讀 346評(píng)論 0 1
  • 前言 大部分編程語言都提供了數(shù)組來保存對(duì)象,數(shù)組是非常重要的數(shù)據(jù)結(jié)構(gòu)之一克胳。但是數(shù)組在初始化時(shí)就已經(jīng)定義了數(shù)組長度平绩,...
    海人為記閱讀 496評(píng)論 0 1