上一篇 <<<HashSet集合底層實(shí)現(xiàn)原理
下一篇 >>>java集合常見面試題
HashTable底層結(jié)構(gòu)
Hashtable 底層使用Entry鏈表數(shù)組存儲(chǔ),Entry自身是單向鏈表
屬性:
final int hash;
final K key;
V value;
Entry<K,V> next;
HashTable初始化
初始容量:11
負(fù)載因子:0.75f
閾值:(int)11*0.75=8
HashTable數(shù)據(jù)添加【使用了全局鎖synchronized】
a、如果傳入的key為空,則報(bào)錯(cuò)
b、計(jì)算hash,找到下標(biāo),如果key存在,則更新返回
c、添加節(jié)點(diǎn)信息
c1、如果數(shù)量大于閾值,則擴(kuò)容
c11、擴(kuò)容
新容量:newCapacity = (oldCapacity << 1) + 1;--老的2倍+1
從尾部往前倒,插入到新的數(shù)組中
c12、重新計(jì)算當(dāng)前節(jié)點(diǎn)下標(biāo)
c2、使用頭插法插入節(jié)點(diǎn)信息
HashTable和ConcurrentHashMap區(qū)別
HashTable線程是安全的,底層采用synchronized把整個(gè)table鎖住解決了線程安全的問題,但這樣多線程最終變?yōu)閱尉€程在執(zhí)行;效率非常低;
ConcurrentHashMap是HashTable的擴(kuò)展,解決了線程安全和多線程的效率問題,但是無法擴(kuò)容。它其實(shí)是默認(rèn)分成16個(gè)不同的小的hashTable,然后在通過一些計(jì)算方式在多線程的情況下讓每個(gè)鍵值對(duì)到不同的hashTTable存放,從而能夠體現(xiàn)多線程的效率問題,也能夠保證線程安全的問題;
也叫分段鎖機(jī)制。

相關(guān)文章鏈接:
<<<Java集合類圖總覽
<<<ArrayList的添加和刪除操作實(shí)現(xiàn)原理圖解
<<<ArrayList的動(dòng)態(tài)擴(kuò)容、ModCount及fail-fast原理
<<<LinkedList增刪改查操作底層實(shí)現(xiàn)原理
<<<數(shù)組拷貝的幾種方式及和鏈表結(jié)構(gòu)的對(duì)比
<<<Jdk1.7HashMap源碼分析
<<<Jdk1.7HashMap如何擴(kuò)容及解決死循環(huán)問題
<<<JDK1.8HashMap源碼分析
<<<ConcurrentHashMap在JDK1.8版本比1.7改進(jìn)了什么
<<<JDK8的HashMap中紅黑樹左旋右旋原理圖解
<<<基于LinkedHashMap手寫LRU淘汰策略
<<<HashSet集合底層實(shí)現(xiàn)原理
<<<java集合常見面試題
