天天看點

HashMap--concurrentHashMap的一些知識搜集

目錄

HashMap

ConCurrentHashMap

面試中經常會被問道:

面試官:有了解HashMap嗎,講一下HashMap吧~
我:呃呃呃~是這樣的,balabalbala~

 搜集了網上的一些資料,估計也不全,大緻也能說明白這個道理,(僅作為面試參考):

這個事情要從JDK的版本更新說起,話說現在,風雲跌宕,大家都講:我們支援的JDK版本最低為1.8~

好,這就是一個目前的分界線了。

先翻曆史,再論現在。

HashMap

JDK1.7

這個版本-HashMap的底層使用數組加連結清單實作。根據key計算出資料下标,如果多個key對應到同一個下标,就用連結清單串起來,新插入的放在前面。

JDK1.8

這個版本有了一些變化,底層使用數組+連結清單/紅黑樹來實作的。連結清單長度超過8,就轉紅黑樹,紅黑樹大小小于6就轉回連結清單

key是如何Hash的呢?
// java HashMap 
static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
           

不夠我說的,太少了,再來點--好的,滿足你-

-推薦-唐彤--zhisheng(公衆号)--的文章--面試官:HashMap 源碼你都不知道還來面試?

tips:除了這些底層結構,加上get --set--這些方法打出來更好--絕對加分項

ConCurrentHashMap

JDK1.7

在Hashmap的基礎上,把資料分為了多個segment段,預設16個段,以段來進行加鎖操作,提高并發效率。

JDK1.8

取消了,大部分操作不加鎖了(紅黑樹的鎖依然存在,如不了解,懂我意思,此處暫不談論)

不使用Segment分段加鎖控制,轉為使用Node+CAS+Synchronized來實作,鎖的粒度轉為HashEntry(首節點)

這些看完覺得不夠,怎麼夠面試說的呢~,這樣有辦法

推薦 厮大 (公衆号-朱小厮的部落格)的一篇文章-叫做--為什麼ConcurrentHashMap的讀操作不需要加鎖?

那你要問HashTable,那這樣,遙遠的從前 java 5開始有了JUC的包,那是已經轉用ConcurrentHashMap而不是HashTable了

好了,給你文章,你自己看吧~

知乎問題: HashMap和Hashtable的差別?