1、HashMap的默认容量为2^4=16
2、如果创建HashMap对象时,数组大小如果不是2的幂次方,底层会把它变成2的幂次方。HashMap的数组大小为什么一定是2的幂次方:
(1) 取模是为了得到数组的索引值(m%n的范围一定是:0~n)
(2) 按位与运算相对于取模运算效率更高
(3) 按位与运算后可以生成索引值,并且索引值一定小于数组的长度。
3、从上面可以看出我们在通过hash值计算索引时,仅仅利用了hash值的低位信息,为了充分利用hash值,使用了>>>与^
,不断的右移不断的利用高位的信息得出索引:
4、装载因子即节点总数量/哈希表数组长度,如果装载因子超过0.75,就扩容为原来的2倍。因为当链表的节点很多时,就会导致查询的的效率很低。扩容的时候会重新计算hash值,而且会带来链表成环导致死循环的问题。
5、Java8如何解决哈希冲突?