緣由:今天好友拿著下面的**,問我為什麼 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...