美文网首页
HashMap关键函数位与运算与取余解惑

HashMap关键函数位与运算与取余解惑

作者: enjoycc97 | 来源:发表于2018-07-28 15:29 被阅读0次

记录这个类本身一些关键函数的原理,和自己一开始没有看懂的地方。

  if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
image.png

这个是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的原因了

相关文章

网友评论

      本文标题:HashMap关键函数位与运算与取余解惑

      本文链接:https://www.haomeiwen.com/subject/juyomftx.html