调整并发哈希映射的大小

时间:2015-03-12 15:57:25

标签: java concurrency hashmap

并发哈希映射调整大小的内存惩罚量是多少。特别是我正在寻找的是

Q1。并发哈希映射的大小是否加倍?我读过的内容表明调整大小是按每个桶完成的,但并不表示存储桶数量的增加是什么

Q2。如果并发哈希映射的大小增加,那么节点如何移动到正确的桶,因为哈希码现在可能不同。具体来说,元素是基于哈希码添加的,因此节点如何通过重新散列来移动。

1 个答案:

答案 0 :(得分:1)

  1. 这是一个实施细节,故意没有记录。通过不记录它,JDK开发人员可以在不违反任何合同的情况下自由地进行性能改进和权衡。您应该避免编写任何对未记录的行为进行假设的代码,例如如何调整集合的大小。 当前实施在class's comments中记录,如果您有兴趣阅读它们,但要了解它们可以并且确实会随着时间的推移而发生变化。

  2. 这同样是一个实现细节,但是您的声明" 哈希码现在可能不同了"是不正确的;记录HashMapConcurrentHashMap在面对更改哈希码的键时表现不正确。因此,我们可以假设哈希码不会改变 - 它只是存储对象的位置发生变化。

    例如假设我们的分段算法只是hashcode % size - 如果一个bin有4个槽而一个对象的哈希码是78,那么它将放在bin 2(78 % 4 = 2)中。如果将bin调整为8个插槽,则对象将移动到bin 6(78 % 8 = 6)。 JDK类使用更优雅的分组算法,但概念是相同的。