JDK 1.7
一、HashMap 的容量为什么是2^n :
在计算entry 要插入位置时:用的时hashcode&(hashmap.length-1)这样计算entry 要插入的位置。
例如 map长度为16
长度 16 :... 0001 0000 (前面的零已经全部省略)
15 :... 0000 1111
Hashcode: ...1011 1010
15 & hashcode =...0000 1010;
如果 长度不是2^n 就不会产生真样的效果
所以长度必须时2^n
由此产生问题:
为什么要用&操作,因为&(与)操作的速度大于%(取余)操作。
二、为什么hash() 中 得到key的 hashcode之后之后还要对它进行 右移,异或?
因为在计算entry要插入位置时,只用到了后面的n位,前面的很多位都没有用到,为了增加散列程度,将hashcode() 方法得到的hashcode 进行了右移并与原来的hashcode进行异或。
三、扩容的实现:
创建一个是原来数组长度二倍的数组,然后转移存储的地址,用(hashcode&现在的长度)来确定位置然后存进去。
四、判断两个key两个key是否相等:
If(e.hash ==hash &&
((k = e.key) == key || (key!=null && key.equal(k))))
// e.hash==hash(e.key);
五、:
1.默认的数组长度是16,如果输入的是10,他会创建一个长度为2^4的数组。
2、添加元素:用得到的index(在数组中的位置),找到数组的位置,然后再用 (上面四中的方法)挨个比较是不是相等,相等就替换oldvalue,如果没有就