java集合(二)HashMap 的长度为什么是2的幂次方

先看下源码

 /**
     * Returns a power of two size for the given target capacity.
     */
    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

a|=b  为a=a|b

可以试一下,如果n是2的幂次方那就不会变化

那么为什么长度要是2的幂次方呢

Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间。那当然是不能直接拿的。

只能通过映射,就是对数组取模。“ (n - 1) & hash”。(n代表数组长度)这是公式

取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率,

这就解释了 HashMap 的长度为什么是2的幂次方。

猜你喜欢

转载自blog.csdn.net/xu505928168/article/details/91383125