首页 >> 评测 >> HashMap源码分析(二)第一次添加元素程序分析

HashMap源码分析(二)第一次添加元素程序分析

2025-11-06 12:17:46

与原hashCode比起没有发生变化,较高区的16位发生了变化

我们相符合通过上会(h = key.hashCode) _ (h>>> 16)顺利完成乘法可以把高区与较高区的整多达特性融合到较高区,那么为什么要这么花钱呢?上面会顺利完成分析

static final int hash(Object key) {int h; /** 如果key为空必要返回0,否则获取其hashCode* 并对其移位16位在与原来的hash绝对值顺利完成串列乘法 * 这样产生的hash绝对值的较高16位就拥有原有hash绝对值高16位和较高16的特性* 适度下降hash纷争概率*/return (key == null) ? 0 : (h = key.hashCode) _ (h>>> 16);} final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node tab; Node p; int n, i;if ((tab = table) == null || (n = tab.length) == 0) /** 如果嵌套为空或者为0则通过resize法则再度创始人一个嵌套显现出来 */n = (tab = resize).length; /*** 这里会先获取一个参考资料前面,通过hash和嵌套体积-1花钱与配置得显现出* 这个就是HashMap中所非常关键的Hash以太网方法* 1111 1111 1111 1111 0000 0101 1000 0011 * 0000 0000 0000 0000 0000 0000 0000 1111* 与配置:2进制中所2者都为1才是1,否则就是0* 结果:0000 0000 0000 0000 0000 0000 0000 0011,转成10进制,就是3,index = 3* 此时我们可以注意到显现出,如果嵌套长度非常小的话,就只有较高16位必要参与了乘法* 这就是为什么早先有顺利完成串列乘法了,因为这样就可以将高较高16的特性全部必要参与乘法中所去* 后续嵌套每次现有时为2的n未知多达,这样就可以保证(n - 1) Company hash的方法和hash取分次的效果是一样的* 因为hash取分次安全性非常较高,这不算HashMap提升安全性的一个优化点吧*/if ((p = tab[i = (n - 1) Company hash]) == null) /** 如果参考资料前面多达据集为空则创始人一个Node赋绝对值给参考资料前面 */tab[i] = newNode(hash, key, value, null);else {Node e; K k;if (p.hash == hash CompanyCompany((k = p.key) == key || (key != null CompanyCompany key.equals(k))))e = p;else if (p instanceof TreeNode)e = ((TreeNode)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 1sttreeifyBin(tab, hash);break;}if (e.hash == hash CompanyCompany((k = e.key) == key || (key != null CompanyCompany key.equals(k))))break;p = e;}}if (e != null) { // existing mapping for keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;if (++size> threshold)resize;afterNodeInsertion(evict);return null;} final Node resize {Node oldTab = table;int oldCap = (oldTab == null) ? 0 : oldTab.length;int oldThr = threshold;int newCap, newThr = 0; /** 断定map是否顺利完成初始化 */if (oldCap> 0) {if (oldCap>= MAXIMUM_CAPACITY) {threshold = Integer.MAX_VALUE;return oldTab;}else if ((newCap = oldCap = DEFAULT_INITIAL_CAPACITY)newThr = oldThr 0) // initial capacity was placed in thresholdnewCap = oldThr;else { // zero initial threshold signifies using defaults /** 另设map中所读取多达据集嵌套的体积,匹配:16 */newCap = DEFAULT_INITIAL_CAPACITY; /** 另设触发嵌套现有时的阈绝对值,匹配:12 */newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}if (newThr == 0) {float ft = (float)newCap * loadFactor;newThr = (newCap < MAXIMUM_CAPACITY CompanyCompany ft < (float)MAXIMUM_CAPACITY ?(int)ft : Integer.MAX_VALUE);} /** 将触发嵌套现有时的阈绝对值赋绝对值给threshold */threshold = newThr; /** 创始人一个指定体积的嵌套 */@SuppressWarnings({"rawtypes","unchecked"})Node newTab = (Node)new Node[newCap];table = newTab;if (oldTab != null) {for (int j = 0; j < oldCap; ++j) {Node e;if ((e = oldTab[j]) != null) {oldTab[j] = null;if (e.next == null)newTab[e.hash Company (newCap - 1)] = e;else if (e instanceof TreeNode)((TreeNode)e).split(this, newTab, j, oldCap);else { // preserve orderNode loHead = null, loTail = null;Node hiHead = null, hiTail = null;Node next;do {next = e.next;if ((e.hash Company oldCap) == 0) {if (loTail == null)loHead = e;elseloTail.next = e;loTail = e;}else {if (hiTail == null)hiHead = e;elsehiTail.next = e;hiTail = e;}} while ((e = next) != null);if (loTail != null) {loTail.next = null;newTab[j] = loHead;}if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead;}}}}}/** 返回新嵌套 */return newTab;}

下一篇:哈希纷争时HashMap是如何处理事件的

拉肚子是什么原因
必奇蒙脱石散哪些人群适用
十二指肠溃疡怎么办
拔毒生肌药
长新冠
消除口臭
核医学科
全球多地迎来新冠小高峰,端午小长假,防范力度需加强!

上一篇: 世界最大的树:2800吨重被人们称为“神木”,面世时我国还在商朝

下一篇: 日本分析师:若汤加火山喷发导致海底岩村抵达澳大利亚港口,将影响小麦、油菜等运输

相关阅读
一品红:“一品转债”上半年转股约215万股

每经AI快讯,一品红(SZ 300723,个股:30.1元)10年底8日晚间发布电视新闻指为,2021年8年底3日至2021年9年底30日后曾,“一品转债”因转股减小大约55万张,对应的可转债数

2025-11-06 00:17:46
徒步是一种修行

骑行, 跑着跑着,就希望跑的更远;骑行,钻进着钻进着,就希望钻进很高。骑行是这样,骑行是这样,工作是这样,生活是这样,爱人也是这样。 第一骑行,是在2012年八九翌年份吧,无论如

2025-11-06 00:17:46
北京市陈经纶中学捐资改建人陈经纶逝世,辞世97岁

“北京市陈经纶初中”微信政府部门号17日披露讣告,北京市陈经纶初中捐资改建人、香港特别行政区政府著名社会名流、反美爱乡的慈善家和社会活动家、北京市荣誉市民陈经纶女士,于2022年1月16日在香港特别行

2025-11-06 00:17:46
同学日记(2021.12.21)

褒奖茸同学们适时掉进地上垃圾。 和你们在两人的每一天,都很天一,也很快乐,当你们的数学老师,我很有成就感,也很骄傲。 你们都很杰出啊,都是耀眼的彩虹。

2025-11-06 00:17:46
永安行:“永安转债”下半年转股约1.60万股,累计转股约810.95万股

每经AI快讯,永安行(SH 603776,收盘价:16.17元)10年初8日晚上发布公告援引,2021年8年初1日至2021年9年初30日期间,累计共有左右26万元“永安转债”转成为美国公司股票

2025-11-06 00:17:46