创建一个HashMap实例,该实例具有足够高的“初始容量”

创建一个HashMap实例,该实例具有足够高的“初始容量”

/**
 * 创建一个{@link HashMap}实例,该实例具有足够高的“初始容量”
 *
 * @param expectedSize 预计容量
 * @since 该方法摘自com.google.guava-30.1.1-jre版本, 由于公司项目没有用此jar包,所以这里摘出来方便使用
 */
public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) {
    return new HashMap<>(capacity(expectedSize));
}

/**
 * 返回一个容量,该容量足以使Map不被调整大小,只要它的大小不超过expectedSize,并且加载因子大于等于它的默认值(0.75)
 *
 * @since 该方法摘自com.google.guava-30.1.1-jre版本, 由于公司项目没有用此jar包,所以这里摘出来方便使用
 */
static int capacity(int expectedSize) {
    if (expectedSize < 3) {
        if (expectedSize < 0) {
            throw new IllegalArgumentException("容量不能为负数,但是现在是: " + expectedSize);
        }
        return expectedSize + 1;
    }
    // int的最大二次幂
    int maxPowerOfTwo = 1 << (Integer.SIZE - 2);
    if (expectedSize < maxPowerOfTwo) {
        //这是JDK8中用于在发生putAll时调整大小的计算;这似乎是我们能做的最保守的计算。0.75是默认负载系数。
        return (int) ((float) expectedSize / 0.75F + 1.0F);
    }
    // int值大于int的最大二次幂了,就没有更大的了
    return Integer.MAX_VALUE;
}
posted @ 2022-11-09 14:17  钟宇/  阅读(48)  评论(0)    收藏  举报