记录这个类本身一些关键函数的原理,和自己一开始没有看懂的地方。
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);

这个是jdk1.8中HashMap中put操作,先判断当前列表是指定hash的位置是否含有对象,如果没有直接在指定位置写入Node(即包括key,value)的链表结构
我一开始没有弄明白(n - 1) & hash 这个是什么意思,实际上就是取模运算的意思
这个如果你有jdk1.7源码也可以关注一下
static int indexFor(int h, int length) {
return h & (length-1);
}
按照之前的理解,如果当前HashMap数组为16,那么你添加一个hash100
的时候应该放在哪里(index:0-15)
通常100%16即可找到也就是4
那么看一下100&15是多少发现也是4,好神奇啊。
那么是不是m&(n-1)==m%n ?
答案是错的,他有一个预备条件是n为2的整数次幂,即为2,4,8,16,32...
可以分析一下这个里面原理奥。
分析一下12%16 16=2^4
备注:右移1位=/2的效果,例16>>1=16/2=8
1100 >>4 =0 ;1100%16==1100 也就是低四位干掉,这样余数也就是低四位
例如11110%16其实应该就是1110
k%(2^n)=(k的低n位)
k/(2^n)=k向右移n位
取一个整数低n位又是怎么样呢。也就是与一个低四位
例如12%16=12的低四位=12&00001111=12&(16-1)
这样大致弄明白m&(n-1)==m%n 的原理,或者说他是在什么情况成立(n=2*k)
这也是HashMap扩容大小都是2^n的原因了
网友评论