分析HashMap 的 JDK 原始碼

2022-09-27 03:45:12 字數 1614 閱讀 5542

緣由:今天好友拿著下面的**,問我為什麼 map.entry 這個介面沒有實現 getkey() 和 getvalue() 方法,卻可以使用,由此,開啟了一番查閱 jdk 原始碼的旅途….

map map = new hashmap();

map.put(1, "張三");

map.put(2, "李四");

map.put(3, "王五");

map.put(4, "趙六");

map.put(5, "錢七");

set set = map.entryset();

for (object object : set)

1.首先,我們看 map 物件,這個 map 物件是 hashmap 的乙個例項,然後下面的 set set = map.entryset(); 可以知道這其實用的 hashmap 實現的 entryset() 方法,然後我們可以檢視 hashmap 裡 entryset() 的原始碼

從原始碼可以看出,這裡的返回了乙個entryset物件,但是需要注意的是這個entryset是hashmap裡的乙個內部類,原始碼如下:

final class entryset extends abstractset>

public final void clear()

public final iterator> iterator()

public final boolean contains(object o)

public final boolean remove(object o)

return false;

} public final spliterator> spliterator()

public final void foreach(consumer super map.entry> action)

if (modcount != mc)

throw new concurrentmodificationexception();}}}

從這裡我們是可以看出,這個entryset其實是封裝的乙個node類的實體。也就是說我們的set其實就是這個node物件。

2.現在我們來說說這個 node 物件,node 物件也是 hashmap 裡的乙個內部類,原始碼如下:

static class node implements map.entry

public final k getkey()

public final v getvalue()

public final string tostring()

public final int hashcode()

public final v setvalue(v newvalue)

public final boolean equals(object o)

return false;

}}可以看出來,這個node物件是map.entry 的實現類,我們可以看到這個node物件實現了getkey()和getvalue()的方法,所以後面呼叫的entry.getkey()以及entry.getvalue()方法其實都是呼叫的 node 物件裡的getkey()和getvalue()方法,這裡就是 j**a 的多型的一種表現。

3.至此,打完收槍!

HashMap 的 get 方法的流程分析(原始碼)

流程首先根據 hash 方法獲取到 key 的 hash 值 然後通過 hash length 1 的方式獲取到 key 所對應的node陣列下標 length對應陣列長度 首先判斷此結點是否為空,是否就是要找的值,是則返回空,否則進入第二個結點。接著判斷第二個結點是否為空,是則返回空,不是則判斷此...

JDK13 HashMap resize原始碼解析

resize是重新雜湊,所以要在現在容量和閾值的基礎上獲取新的容量和閾值,函式首先進行了變數定義 final hashmap.node resize else if newcap oldcap 1 maximum capacity oldcap default initial capacity de...

JDK1 8 HashMap putVal原始碼解讀

final v putval int hash,k key,v value,boolean onlyifabsent,boolean evict 該節點不為鍊錶最後乙個節點,判斷值是否相同,相同直接退出迴圈,因為此時e指向 p.next 即p.next是相同節點,需要替換 if e.hash has...