jdk1 8 詳細解析HashMap 原始碼

2021-10-04 13:19:28 字數 2733 閱讀 1547

本篇主要解析hashmap的增刪查改以及擴容方法

增加:putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict)

/**

* put方法

* @param hash 處理後的hashcode

* @param key 鍵

* @param value 值

* @param onlyifabsent true表示鍵不存在才放入

* @param evict 擴充套件引數,暫時無用

* @return

*/final v putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict)

//如果鍊錶已經存在相同的鍵,退出迴圈

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

//將鍊錶下乙個節點賦值給當前節點

p = e;}}

//只有key已經存在才執行下面,覆蓋原來的值

if (e != null)

}++modcount;

//key已經存在的情況,只會覆蓋value,不會導致長度發生變化,所以不會執行下面resize方法

if (++size > threshold)

resize();

//hashmap提供的擴充套件點

afternodeinsertion(evict);

return null;

}

查詢:getnode(int hash, object key)

/**

* 查詢方法相對清晰明了

* @param hash

* @param key

* @return

*/final hashmap.nodegetnode(int hash, object key) while ((e = e.next) != null);}}

//如果上面都沒找到,返回null

return null;

}

刪除:removenode(int hash, object key, object value,

boolean matchvalue, boolean movable)

/**

* 刪除

* @param hash

* @param key

* @param value

* @param matchvalue

* @param movable

* @return

*/final hashmap.noderemovenode(int hash, object key, object value,

boolean matchvalue, boolean movable)

p = e;

} while ((e = e.next) != null);}}

//上面這一部分和get查詢一樣,不再多說了

if (node != null && (!matchvalue || (v = node.value) == value ||

(value != null && value.equals(v))))

}return null;

}

擴容:resize()

/**

* 1.陣列初始化

* 2.陣列擴容

* @return

*/final hashmap.node resize()

else if ((newcap = oldcap << 1) < maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr << 1; // double threshold

}//建立hashmap並設定了初始大小 eg:new hashmap(10)

else if (oldthr > 0)

newcap = oldthr;

//建立hashmap但是沒有設定初始大小 eg:new hashmap()

else

//只有建立hashmap並設定了初始大小,才會走下面

if (newthr == 0)

threshold = newthr;

hashmap.node newtab = (hashmap.node)new hashmap.node[newcap];

table = newtab;

//當第一次初始化map時,不會走下面擴容。直接返回

if (oldtab != null)

//不為0放在高位鏈=原陣列索引位置+原陣列長度

else

} while ((e = next) != null);

if (lotail != null)

if (hitail != null) }}

}}

return newtab;

}

Vector原始碼解析 jdk1 8

概述 vector實現了list的介面,底層同樣是基於陣列實現的,可以儲存null。功能結構與arraylist的類似,不同的是執行緒安全的。建構函式protected object elementdata protected int capacityincrement public vector ...

HashSet原始碼解析 JDK1 8

在我們學過hashmap之後,再來看hashset就很easy了。因為hashset是基於hashmap是實現的。開啟hashset的原始碼,可以看到維護了乙個hashmap 一 成員變數 用來儲存 hashset 的元素private transient hashmap,object map 這個...

jdk1 8原始碼解析 ArrayList

arraylist是乙個長度可調節的陣列,使用者只需向其中新增,刪除,獲取元素,可以向其中新增任何物件 包括null值 無需關係它的擴容,縮減問題。它實現了list介面所有方法,它基本等價於vector,唯一不同的是它沒有任何同步手段,多執行緒環境須慎重考慮。這裡唯一需要注意的是,它實現了乙個ran...