HashMap中的indexFor是如何计算的

HashMap中的indexFor方法分析

分析java7的HashMap源码的时候,其用indexFor来计算entry对象在table数组中的索引值

    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);
    }

为什么不是对hash表的长度取余,而使用&进行位运算呢?

    /**
     * The table, resized as necessary. Length MUST Always be a power of two.
     */
    transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

    /**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

DEFAULT_INITIAL_CAPACITY是初始化数组的默认长度,初始值为16。table为存储对象的数组,由注释可以知道,其长度必定为2的次方。

那么为什么要使用h & (length-1)来获得下标呢?

因为length为2^n,所以length-1换算成二进制,其全部位数均为1。按位与计算的原则是两位同时为“1”,结果才为“1”,否则为“0”。所以对于计算表达式h & (length-1)来说,等同于返回h的低(length-1)位,与h%length相同,但是快很多。

举个例子,假设h为1000,length为512,

    hash h 11 1110 1000 1000 in decimal
  length l 10 0000 0000 512 in decimal
  length-1 01 1111 1111 511 in decimal-it will always be all Ones
  h &(l-1) 01 1110 1000 488488 in decimal which is a result of 1000 mod 512 

由上述例子可以看出,h&(length-1)h%length得出的结果是一样的(返回h的低(length-1)位),但是位运算的速度会更快些

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值