HashMap中对 h&(length-1)的理解

背景:今天这篇文章主要针对数组下标计算知识的一些零散补充,因为作者并没有学习过数据结构相关知识,所以在&标识进行二进制计算时一些过程比较疑惑,度娘半天竟然没有人能具体说清楚,大概率还是自己知识太薄不能理解其它文章一些意思,所以此文今天会对&计算过程重点做一些介绍。

1、HashMap 数组下标计算方式:

HashMap中对 h&(length-1)的理解_第1张图片

(h 是k的hashcode值;length是数组长度,HashMap数组默认长度是16)

2、&是什么意思?

&在 java 中做与运算,& 是所有的2进制位数“与”出的最终结果,“与”的规则是两者都为1时才得1,否则就得0

例如

132&15 = ?

答案:4

why?

阿拉伯数字(十进制):129       二进制:10000100

阿拉伯数字(十进制):15      二进制:0000 1111(计算器转换应该是1111,因为两个二进制进行运算时,需要在位数少的前面补零-补码操作)

10000100 & 0000 1111 = 0100

(0100 & 1111 = 0100 )真正的运算是这样的,根据&的规则则取末尾是0的0100

根据上述的例子差不多能明白点了吧,如果还有疑惑点接着往下看


public class HashTest {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(128&129); //128:10000000	  129:10000001    ##结果:128(10000000)
		System.out.println(128&15);  //15:0000 1111   128:10000000   ##结果:0(0000)
		System.out.println(129&15);  //15:0000 1111   129:10000001   ##结果:1(0001)
		System.out.println(134&15);  //15:0000 1111   134:10000110   ##结果:6(0110)
		System.out.println(134&14);  //14:0000 1110   134:10000110   ##结果:6(0110)
		System.out.println(133&15);  //15:0000 1111   133:10000101   ##结果:5(0101)
		System.out.println(132&15);  //15:0000 1111   132:10000100   ##结果:4(0110)
        System.out.println(132%16);  //结果:4
	}
}

①、当两个数末尾是1和0时,根据规则取0的数

②、当两个数末尾都是1时,根据规则取数小的,例如1111和0101就是0101

③、132&15和132%16值是一样的,其实就是两个公式的表达h&(length-1)和 h%length,面试的时候我觉得说哪一种都没有什么问题。

结语:整篇文章完全是自己几个小时浅薄的理解记录仅供读者参考,作者自己也不能确定说的就是正确的,只是自己实验的总结,欢迎读者评论区讨论。

参考博客:

https://www.iteye.com/topic/539465

二进制转换器:https://tool.lu/hexconvert/

你可能感兴趣的:(面试,Java)