-
HashMap
數(shù)組+鏈表
非同步,可使用 Collections.synchronizedMap 構(gòu)造同步 HashMap
通過(guò)“拉鏈法”實(shí)現(xiàn)的哈希表
默認(rèn)容量 16,必須為 2 的冪
table ,一個(gè) Entry 數(shù)組(Entry 實(shí)際為單項(xiàng)鏈表)
size,鍵值對(duì)數(shù)量
threshold,閾值 = 容量 × 加載因子,用于判斷是否需要調(diào)整容量
-
loadFactor,加載因子,默認(rèn) 0.75,時(shí)間與空間上的一種折中
- 哈希沖撞
modCount -> fail-fast 機(jī)制
hash() 計(jì)算 key 的 hash 值,供尋找索引使用
indexFor() 返回?cái)?shù)組索引 hash & (length - 1)
resize() 重新調(diào)整大小,重新將元素添加到新數(shù)組
put 元素放在鏈表表頭
Entry implements Map.Entry ; key, value, next, hash
-
HashIterator implements Iterator
- current, next
- expectedModCount
- hasNext(), nextEntry(), remove()
keySet, entrySet;Set不包含重復(fù)元素
values 為 Collection,可重復(fù)
1.8 中使用了紅黑樹(shù),在某個(gè)桶中鏈表長(zhǎng)度達(dá)到 8 時(shí),鏈表會(huì)轉(zhuǎn)化為紅黑樹(shù),提升查找性能 (
O(N)->O(logn))-
ConcurrentHashMap
- 不允許
key/value為空 - 1.7
- 分段鎖
Segment繼承ReentrantLock,分段只在使用時(shí)才會(huì)創(chuàng)建- 一個(gè)分段鎖定不影響其他分段的訪問(wèn),提升高并發(fā)環(huán)境下的處理能力
- 每個(gè)分段其實(shí)也是一個(gè)表
- 默認(rèn)容量 16,默認(rèn)并發(fā)度 16,默認(rèn)負(fù)載因子 0.75
-
put時(shí)會(huì)進(jìn)行tryLock一定次數(shù)后,若仍無(wú)法獲取鎖,則通過(guò)lock申請(qǐng)- 獲得鎖后對(duì)鏈表進(jìn)行遍歷查找,無(wú)相同節(jié)點(diǎn)則將新的
HashEntry做為鏈表頭 - 如果容量達(dá)到閾值,則對(duì)
Segment進(jìn)行rehash擴(kuò)容
- 獲得鎖后對(duì)鏈表進(jìn)行遍歷查找,無(wú)相同節(jié)點(diǎn)則將新的
- 弱一致性:
get,containsKey沒(méi)有使用鎖,而是通過(guò)Unsafe的getObjectVolatile()提供原子語(yǔ)義 -
size,containsValue- 進(jìn)行兩次操作,如果連續(xù)兩次所有
Segment的modcount和相等,則說(shuō)明未發(fā)生其他修改,返回獲得的值 - 應(yīng)避免在多線程情況下使用
- 進(jìn)行兩次操作,如果連續(xù)兩次所有
- 分段鎖
- 1.8
- 放棄分段鎖,使用 CAS +
synchronized頭節(jié)點(diǎn) - 與 HashMap 類似,使用 數(shù)組+鏈表+紅黑樹(shù) 實(shí)現(xiàn)
-
Node<K,V> implements Map.Entry<K,V>用于存儲(chǔ)鍵值對(duì) -
TreeNode<K,V> extends Node<K,V>用于放入TreeBin完成紅黑樹(shù)的轉(zhuǎn)換
- 放棄分段鎖,使用 CAS +
- 不允許
FAQ-HashMap & ConcurrentHashMap
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 本系列出于AWeiLoveAndroid的分享,在此感謝,再結(jié)合自身經(jīng)驗(yàn)查漏補(bǔ)缺,完善答案。以成系統(tǒng)。 Java基...
- 1.ConcurrentHashmap簡(jiǎn)介 在使用HashMap時(shí)在多線程情況下擴(kuò)容會(huì)出現(xiàn)CPU接近100%的情況...
- 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對(duì)于byte類型而言...
- 你也許經(jīng)常聽(tīng)到閨蜜說(shuō)某個(gè)護(hù)膚品好,推薦給你用,但是你用了過(guò)后并沒(méi)有改善皮膚狀態(tài),甚至反而加重了皮膚負(fù)擔(dān)。 其實(shí)適合...
- 把所有的感動(dòng) 交織成詩(shī)章 讓思想的明輝 飛渡于時(shí)光之上 你替我開(kāi)疆辟土 親手為我種上了一棵小樹(shù) 澆水,施肥,修護(hù) ...