HashMap的indexFor()方法详解


/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
return h & (length-1);
}


这个方法有点意思,主要作用是定位hashmap里的bucket。
-------------------------------------------------------
大家知道hashmap底层就是一个数组,然后数组里每个元素装了个链表。
这个数组元素称为bucket桶
-------------------------------------------------------

先复习一下逻辑与。

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


第二个参数length始终为2的n次方,所以,
换成二进制数就是 100,1000,10000,...
(length -1)就是 11, 111,1111,...

这样的话,
第一个参数h比第二个参数小的情况下,那结果就是h。
第一个参数h比第二个参数大的情况下,如下:
例:
h=18 -> 10010
length-1=15 -> 01111

10010
01111
-------
00010 (即2)


也就是h-length,

假设 h=5,length=16, 那么 h & length - 1 将得到 5;如果 h=6,length=16, 那么 h & length - 1 将得到 6 ……如果 h=15,length=16, 那么 h & length - 1 将得到 15;但是当 h=16 时 , length=16 时,那么 h & length - 1 将得到 0 了;当 h=17 时 , length=16 时,那么 h & length - 1 将得到 1 了
这样就能保证取得合理的索引值。


参考blog:http://alex09.iteye.com/blog/539545
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值