乙個demo告訴你HashMap容量變化

2021-08-21 13:29:14 字數 1542 閱讀 7076

對hashmap所有了解的都知道hashmap有乙個負載因子loadfactor,當hashmap容量超過閥值時將進行擴容,該文就是根據圍繞hashmap的閥值、容量進行**,這些**也是源於一開始了解hashmap的容量都是通過別人的文章,卻從未自己去體驗測試過。

該文主要解決之前促使我去**hashmap及**中所遇到的問題:

(1)new hashmap(n) 的初始閥值/容量是多少?

(2)為什麼new hashmap(n) put進乙個元素後閥值會發生變化?

(3)hashmap達到閥值時擴容的變化規律?

以下將根據問題給出對應的主要**(jdk1.8)進行解答:

(1)new hashmap(n)將涉及以下2個方法,tableresizefor方法的作用是返回比cap大的最小的乙個2的n次冪數字如:cap=15則n=16,cap=23則n=32

public hashmap(int initialcapacity, float loadfactor)
static final int tablesizefor(int cap)
(2)當hashmap首次put元素時,由於對映中的節點table為空,將對hashmap的容量進行resize,將當前的容量設為initcap*loadfactor

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;}}

v oldvalue = e.value;

if (!onlyifabsent || oldvalue == null)

e.value = value;

afternodeaccess(e);

return oldvalue;}}

++modcount;

// 容量已滿時進行resize()

if (++size > threshold)

resize();

afternodeinsertion(evict);

return null;

}

(3)hashmap達到閥值時擴容則是在比原容量大且最接近原容量的乙個2的指數次冪數字*2(拋開maximum_capacity = 1 << 30討論),這一切都在hashmap的resize()方法進行。以下是個人的測試**及輸出結果圖,可以更清晰地反應hashmap容量變化:

乙個demo告訴你優化演算法的強大

這裡的demo是乙個累加演算法,如1,2,3,4.n 即 sum 1 2 3 4.n 我們可以這樣做 1 2 迴圈實現累加方法3 param value4 return5 6private static long cycle long value 12return sum 13 另一種方法 高斯方法...

CODING 告訴你如何建立乙個 Scrum 團隊

翻譯君 coding 敏傑小王子 scrum 當中有三個角色 po product owner 敏捷教練 scrum master 和開發團隊。雖然這看起來很清晰,但如何處理現有職位的問題可能會讓人感到困惑。許多團隊詢問在採用 scrum 時是否需要更改崗位名稱?最簡潔的答案是 不 在本文中,我們將...

乙個故事告訴你,壓力真的可以擊垮乙個人

最近感受到了一波巨大的壓力,好在也過去了,過去的兩個月壓力太大 壓力就是自己接了乙個私包,按時完成各種風波都遇到了 每天晚上睡覺都夢到要做的事情,有時候白天都精神恍惚 在此也提醒各位兄弟姐妹們,善待自己,對自己好些,別人對我們不好,我們自己對自己好些 讓自己適當的減壓,不要讓自己的精神狀態一直處於拉...