二进制运算与Java逻辑&

背景摘要:二进制是计算机专业的入门篇,01010101010101010011001011011010100101010101010101010101010100101101011001010110101011110101010101010101011。好那么关于二进制的我们说了这么多,再说说 逻辑"&",今天主要根据JDK1.7HashMap源码indexFor方法来进行解析。讲其的运算规则详情与其作用。

目录

一、二进制运算结构解析

二、HashMap源码IndexFor方法 "&"字符的运用


一、二进制运算结构解析

大家应该都知道程序有很多进制,好的那我们今天只讲老祖宗二进制运算结构步骤。

首先是计算16(偶数)的二进制。运算为不断除2,首先除2为8,余0,依次除尽。计算结果最终从下往上取值为10000。

但一般最后为8尾数做填充,故最终值为00010000。

再来计算15(奇数)的二进制。

同理:(15-1)/2 = 7 余1 。依次(n-1)/2,得出1111。填充四个0,最终值:00001111

 看完这些相信你会觉得很简单,当然也有在线的进制转换工具。点我

那么今天的主角“&”。为什么说“&”是主角?我们能通过HashMap源码来了解他真正的作用,同时也能了解HashMap一个小细节知识点。由浅入深的慢慢的进入HashMap。

 

二、HashMap源码IndexFor方法 "&"字符的运用

你可能以为我只是要说“&”,其实我还要扯上:

首先说说IndexFor方法在HashMap中主要是干嘛的:根据元素的HashCode来计算元素在HashMap集合(数组+链表)中对应链表的下标。那么既然是计算,HashMap中,存取都是用到了该方法的。且该方法决定了HashMap在put存值时存在哪个链表中。

当然关于HashMap的知识不了解也没关系。来分析分析“&”计算。

“&” 又称 与运算 如果两者都是为1,那么结果为1,否则就是0。

1&0=0;0&1=0;1&1=1;0&0=0;

那么再说说HashMap中的index运算。首先HashMap的初始容量为16。那么上文我们得知计算结果值为00010000;我们现在假设某元素的HashCode为103;对16进行计算结果。

static int indexFor(int h, int length) {
    return h & (length-1);
}

通过工具计算我们得知103的编码为:01100111

再将两者根据计算公式进行对比:

结果值很明显为:0.那么我们发现偶数的对比为0。所以计算的索引为0。其次,104/105皆是0

那么我们发现,“&”16(偶数)的情况都是0。从而导致索引冲突碰撞那么就极大的增加了HashMap中存取运算的速度。那么在HashMap运算“&”时做了 (length-1)。采用16-1=15(单数)从而结果就不会那么容易一致。

最终结果对比如图:

 

总结:

二进制计算即除2到尽头止。JDK1.7中HashMap源码采用IndexFor方法进行逻辑与“&”的运算来进行索引位置的计算。同时通过 length-1来优化计算公式,避免索引出现高重复碰撞。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值