“的意义”;“2”的幂;在java.util.HashMap实现中

“的意义”;“2”的幂;在java.util.HashMap实现中,java,hashmap,Java,Hashmap,可能重复: 我正在阅读java.util.HashMap中HashMap的实现。初始容量、最大容量等为二的幂 从java.util.HashMap复制的声明部分 /** *默认初始容量-必须是2的幂。 */ 静态最终int默认值初始容量=16; /** *如果隐式指定了更高的值,则使用最大容量 *由具有参数的构造函数之一执行。 *必须是二次幂使用二次幂可以简化实现并提高性能 例如,要从散列码中找到一个bucket,它可以使用散列&(SIZE-1)而不是abs(hash)%SIZE从理论上讲,只

可能重复:

我正在阅读java.util.HashMap中HashMap的实现。初始容量、最大容量等为二的幂

从java.util.HashMap复制的声明部分

/**
*默认初始容量-必须是2的幂。
*/
静态最终int默认值初始容量=16;
/**
*如果隐式指定了更高的值,则使用最大容量
*由具有参数的构造函数之一执行。

*必须是二次幂使用二次幂可以简化实现并提高性能


例如,要从散列码中找到一个bucket,它可以使用
散列&(SIZE-1)
而不是
abs(hash)%SIZE

从理论上讲,只有当操作随着映射中元素数量的增加变得微不足道时,我们才能分摊扩展列表的成本。每次达到负载系数时将大小加倍是确保分录的扩展和重新加载摊销的一种方法


最初它是2的幂的原因是,当我们散列一个元素时,得到的整数(32位)可以被截断为前k位,其中k是log(N),其中N是当前容量。

某些类型的散列表使用计算出的散列值的位模式中的一些位,作为数组中的索引。在这种情况下,大小必须是2的幂。HashMap的实现似乎是这样的,这两点都是正确的,但值得注意的是,第二点在性能方面相对不重要。
/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 16;


 /**
 * The maximum capacity, used if a higher value is implicitly specified
 * by either of the constructors with arguments.
 * MUST be a power of two <= 1<<30.
 */
static final int MAXIMUM_CAPACITY = 1 << 30;


/**
 * The table, resized as necessary. Length MUST Always be a power of two.
 */
transient Entry[] table;