背景摘要:二进制是计算机专业的入门篇,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来优化计算公式,避免索引出现高重复碰撞。