Java8 HashMap扩容算法实例解析
转移过程大致是:依次从旧数组里取值,然后从该值对应的链表上依次取出节点,对节点取模分别放入lo链表和hi链表,当链表中节点遍历完后,分别把lo链表和hi链表放入新数组的不同位置。在看到如下第15行时,我在想,为什么== 0时就放入lo链表,否则就是hi链表?说到这个问题,那我们就要回顾下HashMap存入新元素的过程了。看下面的第45行,可以发现插入时是使用 & hash来计算位置的,即数组长度-1,而扩容移位是使用数组长度n计算的,那这是为什么呢?hash1 & n = 0x0000hash2 & n = 0x1000此时两者的结果是不一样的,并且相差0x1000即10进制的8即数组长度.。
用户评论