HASHMAP原始碼學習心得

2021-10-07 01:55:59 字數 2298 閱讀 2291

個人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...