为什么java hashmap调整大小或重新设置不像redis那样采用渐进的方法

6qftjkof  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(307)

我只是想知道为什么jdk hashmap重新散列过程没有像redis那样采用渐进的方法。虽然jdk hashmap的重新哈希计算非常优雅和有效,但是当原始hashmap中的元素数包含相当多的条目时,仍然需要花费相当长的时间。我不是一个有经验的java用户,所以我总是认为java设计者的考虑超出了我的认知能力。类似redis的渐进式重灰化可以有效地将工作负载分配给hashmap中的每个put、delete或get,这可以显著减少重设大小/重灰化时间。我还比较了两种哈希方法,在我看来,这两种方法并没有限制jdk进行逐步的重新哈希。希望有人能给点线索或启发。提前多谢了。

izj3ouym

izj3ouym1#

如果你考虑一下像这样的增量再灰化的成本和收益 HashMap 事实证明,成本并不是微不足道的,收益也不是你想要的那么大。
逐渐地重新洗牌 HashMap :
平均多使用50%的内存,因为它需要在增量重放期间同时保留旧表和新表;和
每次操作的计算成本略高。也:
重新灰化仍然不是完全增量的,因为分配新的哈希表数组必须一次完成;所以
任何操作的渐近复杂性都没有改进。最后:
由于不可预测的gc暂停,几乎没有什么真正需要增量重灰化的东西可以在java中实现,所以为什么要费心呢?

相关问题