HashMap中indexFor方法深入探讨

本文通过实验比较了在Java中使用位运算(&)与取模运算(%)来计算HashMap索引的方法,展示了位运算在效率上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HashMap中indexFor方法是用来查找数组下标的。在取数组下标的时候m&(lenth-1) 和m&length的值是一样的。

比如 

m = 7 ,lenth=8那么7&8 =7

7的二进制表示为111,

111 & 111 = 111 =7

下面我们来看看在java代码中看看他们的执行时间如何

@Test
public void test2() {
    int capacity = 32;
    int val = 13;
    int count = 2000;
    long t1 = System.nanoTime();
    for (int i = 0; i < count; i++) {
        indexFor1(val,capacity);
    }
    long t2 = System.nanoTime();

    System.out.println("& time:"+(t2-t1));


    long t3 = System.nanoTime();
    for (int i = 0; i < count; i++) {
        indexFor2(val,capacity);
    }
    long t4 = System.nanoTime();

    System.out.println("% time:"+(t4-t3));

}

static int indexFor1(int h, int length) {
    return h & (length-1);
}
static int indexFor2(int h, int length) {
    return h % (length);
}

这是m =13,length =32

第一次 当执行2000次时

& time:104688

% time:134657

第二次 当执行20000次时

& time:806302

% time:879379

第三次 当执行200000次时

& time:2035873

% time:2359790

第四次  当执行2000000次时

& time:1945554

% time:2849155

第五次 当执行20000000次时

& time:1457010

% time:2105665

可以看到确实 & 比 % 好一点,说好多少,我确实不敢说,没次执行都是不同的,数据计算涉及到硬件的交互,准确的数据报告还需要权威给出,这个只做一个简单的探讨。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值