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

时间:2012-05-17 08:52:20

标签: java hashmap

  

可能重复:
  Java HashMap Default Initial Capacity

我正在java.util.HashMap中阅读HashMap的实现。初始容量,最大容量等是2的幂。

从java.util.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;

评论表明尺寸必须是2的幂。为什么两个人的权力如此重要?

2 个答案:

答案 0 :(得分:17)

使用2的幂简化了实现并提高了性能。

E.g。要从哈希码中查找存储桶,可以使用hash & (SIZE -1)代替abs(hash) % SIZE

答案 1 :(得分:1)

从理论上讲,只有当地图中的元素数量增加时,操作变得可以忽略不计,我们才能分摊扩展列表的成本。每次达到负载系数时,将大小加倍是确保条目扩展和重新加载的一种方法。

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