HashMap的容量的默认初始化为什么是16

1,067 阅读1分钟

最近在看HashMap的源码想到的一个问题,先看下代码

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

文档里面提到了容量一定是2的幂,那么为什么hashmap要求一定是2的幂方呢,我们看下put元素时,HashMap计算下标时的代码, 为了聚焦本文的重点,我们只来看一下indexFor方法。我们先来看下Java 7(Java8中虽然没有这样一个单独的方法,但是查询下标的算法也是和Java 7一样的)中该实现细节:

static int indexFor(int h, int length) {
    return h & (length-1);
}

indexFor方法中 h & (length-1) 是什么意思呢,其实它就是取模,java之所以用位运算(&)来代替取模运算(%),其实就是基于效率的考虑,在位运算和取模运算效率测试 这篇文章中,比较了位运算和取模运算的效率,结果是位运算的效率高出了很多,该方法目的是计算添加元素的下标,其实就是对HashMap的容量进行取模,为了提升取模的效率,使用位运算代替了取模运算,这就要求HashMa的容量一定得是2的幂。而作为默认容量,太大和太小都不合适,所以16就作为一个比较合适的经验值被采用了。

引用

(1)来源:HollisChuang 为啥HashMap的默认容量是16?