【问题标题】:significance of "power of 2" in java.util.HashMap implementation [duplicate]java.util.HashMap实现中“2的幂”的意义[重复]
【发布时间】:2012-05-24 20:09:48
【问题描述】:

可能重复:
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;

cmets 建议尺寸必须是 2 的幂。为什么二的力量如此重要?

【问题讨论】:

  • 某些类型的哈希表使用计算的哈希值的位模式中的一些位作为数组的索引。在这种情况下,大小必须是 2 的幂。看来 HashMap 的实现就是这样工作的。

标签: java hashmap


【解决方案1】:

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

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

【讨论】:

  • 两点都是正确的,但值得注意的是,第二点在性能方面相对不重要。
【解决方案2】:

使用 2 的幂可以简化实现并提高其性能。

例如要从哈希码中找到一个桶,它可以使用hash &amp; (SIZE -1) 而不是abs(hash) % SIZE

【讨论】:

    猜你喜欢
    • 2017-10-27
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多