前段时间去面试的时候坐在等候室里,听到隔壁会议室里的面试:
面试官:“你说一下为什么HashMap的长度为什么要设计成2的幂次方”
面试者:“因为计算机计算是二进制运算,所以balabala.....”
当时听的很模糊,也不知道面试者回答的是不是对的,所以一直记着回来一定要上网查一下正确的原因……
查阅了相关文章后,其实面试者回答的方向是对的,确实是为了提高运算效率。
我们都知道HashMap计算key的位置算法为:key.hash%length;
查看源码发现实现已优化为:hash & (length - 1),很显然,因为计算机位运算的效率比直接进行取余来的快;
可以思考一下什么当length的值为什么的时候 hash % length == hash & (length - 1)
答案就是当length为2的幂次方时。
可以验证一下:5 % 8 = 5,5 & (8 -1) = 110 & 111 = 110 = 5(十进制)
由此与运算可以思考一下为什么2的幂次方可以减少Hash碰撞;
因为(2的n次方-1)的二进制是n个1,一个key的hash值&1111……,就可以保证结果最大程度取决于key.hash。
如果是key.hash & 2n次方,就是 hash % 100……,与运算则后面的结果全都为0,增大了hash碰撞的概率。