個人hashmap原始碼學習心得共勉 (不足之處,還望指出)
1.hashmap的原理,內部資料結構
a.jdk1.7是陣列 + 鍊錶
b.jdk1.8底層使用雜湊表(陣列+鍊錶),當鍊表過長會將鍊錶轉換成紅黑樹加以實現
2.分析一下hashmap的put方法過程
a.對key求hash值,然後在計算下標
b.如果沒有碰撞,直接放入桶中
c.如果碰撞了 ,以鍊錶的方式鏈結到後面
d.如果鍊錶長度超過閥值(treeify_threshold == 8 ),就把鍊錶轉換成紅黑樹
e.如果節點已經存在就替換
f.如果桶滿了(容量(16) * 載入因子(0.75)),就需要resize(擴容)
hashmap的put的核心**如一下**所示
/*
hashmap中put(k,v)原始碼核心分析
hashmap中putval( [hashmap-> put() --> putval() ] )方法部分核心**講解
三種情況
1.key值相同,直接替換老的值就可以
2.key值不同,紅黑樹處理
3.key值不同,煉表處理
*/node tab; nodep; int n, i;
if ((tab = table) == null || (n = tab.length) == 0) //key值相同,直接替換老的值就可以
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)//key值不同,紅黑樹處理
tab[i] = newnode(hash, key, value, null);
else
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;}}
v oldvalue = e.value;
if (!onlyifabsent || oldvalue == null)
e.value = value;
afternodeaccess(e);
return oldvalue;
}
//hashmap核心的rresize()方法詳解
final node resize()
else if ((newcap = oldcap << 1) < maximum_capacity &&
oldcap >= default_initial_capacity)
newthr = oldthr << 1; // double threshold
}else if (oldthr > 0) // initial capacity was placed in threshold
newcap = oldthr;
else
if (newthr == 0)
threshold = newthr;
@suppresswarnings()
node newtab = (node)new node[newcap];
table = newtab;
/*前提:必須要保證陣列位置上的節點不為空
1.陣列位置不為空
2.陣列下標位置不為空
a.單純的node節點
b.陣列下標位置不為空,但下面為紅黑樹
c.陣列下標位置不為空,但下面為鍊錶
*/if (oldtab != null)
else
} while ((e = next) != null);
if (lotail != null)
if (hitail != null) }}
}}
return newtab;
}
5.針對hashmap中的某個entry鏈太長,查詢時間複雜度可能達到0(n),怎麼優化?
將鍊錶轉換成紅黑樹.jdk1.8已經實現.(部分核心**如下分析所示)
//鍊錶轉換成紅黑樹核心代原始碼分析
for (int bincount = 0; ; ++bincount)
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
hashmap原始碼學習
最近面試被問到了hashmap原始碼,所以再次認真學習整理一下 基於jdk1.7 hashmap主要由陣列和鍊錶組成,陣列是hashmap的主體,鍊錶是為了解決hash衝突而設計的。entry是hashmap的基本組成單元。每個entry包含一對key value的鍵值對。entry主要包括四個屬性...
HashMap原始碼學習
自己在學習的時候總感覺看懂了又沒有看懂,總有一層霧,所以乾脆寫個博文,看能不能徹底弄懂。測試用 hashmapmap new hashmap map.put 1 2 map.put 2 4 map.put 3 6 map.put 4 8 map.put 5 1 map.put 6 1 map.put...
HashMap原始碼學習
最大容量 2的30次方 static final int maximum capacity 1 30 預設的載入因子 static final float default load factor 0.75f 雜湊桶,存放鍊錶。長度是2的n次方,或者初始化時為0.transient node tabl...