亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

new HashMap(10000,0.75f) 是說hash值不碰撞的情況下吧

這個例子產生的HashMap的長度是12288, 如果在hash值沒有規定是否會碰撞 的條件下, 輸入12288條數據, 也不一定會發生擴容吧, 有可能極端的情況會有很多hash值碰撞, 導致數組上的空位還能大于四分之一的容量, 這樣也不會擴容吧, 老師講的例子, 前提是hash值不碰撞的情況, 對吧.

正在回答

4 回答

我覺得你理解的沒問題啊,為什么這么多反駁的??

0 回復 有任何疑惑可以回復我~

你的理解有偏差, 跟是否產生hash碰撞沒關系!!?

new HashMap(10000, 0.75f)這里的10000指的是map里存的key的數量, map里有個成員變量size來記錄的, 不是代表數組大小!?

可以看HashMap的put方法的源碼, 如果key已存在, 會替換對應的value, 否則size就會自增1.?

當size>容量*0.75時, 會進行擴容.

可以做個試驗論證下:

HashMap<Integer,?String>?map?=?new?HashMap<Integer,?String>(8,?0.75f);
for?(int?i?=?1;?i?<=?8;?i++)?{
????map.put(8?*?i,?"test");
}

設置容量為8, 每次put的都是8的倍數, 所以每次put都會產生hash碰撞, 但是仍然在put6次(8*0.75)之后進行了擴容!

http://img1.sycdn.imooc.com//601654b500018fd706720243.jpg


HashMap的put源碼:

public?V?put(K?key,?V?value)?{
????return?putVal(hash(key),?key,?value,?false,?true);
}
final?V?putVal(int?hash,?K?key,?V?value,?boolean?onlyIfAbsent,
???????????????boolean?evict)?{
????Node<K,V>[]?tab;?Node<K,V>?p;?int?n,?i;
????if?((tab?=?table)?==?null?||?(n?=?tab.length)?==?0)
????????n?=?(tab?=?resize()).length;
????if?((p?=?tab[i?=?(n?-?1)?&?hash])?==?null)
????????tab[i]?=?newNode(hash,?key,?value,?null);
????else?{
????????Node<K,V>?e;?K?k;
????????if?(p.hash?==?hash?&&
????????????((k?=?p.key)?==?key?||?(key?!=?null?&&?key.equals(k))))
????????????e?=?p;
????????else?if?(p?instanceof?TreeNode)
????????????e?=?((TreeNode<K,V>)p).putTreeVal(this,?tab,?hash,?key,?value);
????????else?{
????????????for?(int?binCount?=?0;?;?++binCount)?{
????????????????if?((e?=?p.next)?==?null)?{
????????????????????p.next?=?newNode(hash,?key,?value,?null);
????????????????????if?(binCount?>=?TREEIFY_THRESHOLD?-?1)?//?-1?for?1st
????????????????????????treeifyBin(tab,?hash);
????????????????????break;
????????????????}
????????????????if?(e.hash?==?hash?&&
????????????????????((k?=?e.key)?==?key?||?(key?!=?null?&&?key.equals(k))))
????????????????????break;
????????????????p?=?e;
????????????}
????????}
????????if?(e?!=?null)?{?//?existing?mapping?for?key
????????????V?oldValue?=?e.value;
????????????if?(!onlyIfAbsent?||?oldValue?==?null)
????????????????e.value?=?value;
????????????afterNodeAccess(e);
????????????return?oldValue;?//?只有key存在的情況下,?size才不會自增
????????}
????}
????++modCount;
????if?(++size?>?threshold)//?key不存在,?size自增
????????resize();
????afterNodeInsertion(evict);
????return?null;
}


2 回復 有任何疑惑可以回復我~
#1

慕圣6469543

老哥,有個疑問想請你指教下。 1.在創建map的時候10000確實是map的容量,不是key的數量啊,源碼是threshold = 10000重新計算之后的值 2.照你的例子,如果每次put8的倍數都產生了碰撞,那么此時還有5個容量位置沒有被占用,此時也沒有滿足因子,map在這個時候擴容,效率豈不是降低了 3.老師的例子舉得很明白啊,擴容就是根據容量的占用是否滿足因子來計算的。如果根據錄入的條數,碰撞的幾率很大的情況下,map有必要進行擴容嗎
2022-05-06 回復 有任何疑惑可以回復我~

不是的,看源碼,是錄入的條數不是用的多少個長度

0 回復 有任何疑惑可以回復我~

其實說的是長度,不是錄入的數據有多少條,所以不要被老師帶偏了


0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

new HashMap(10000,0.75f) 是說hash值不碰撞的情況下吧

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號