我只是想知道为什么jdk hashmap重新散列过程没有像redis那样采用渐进的方法。虽然jdk hashmap的重新哈希计算非常优雅和有效,但是当原始hashmap中的元素数包含相当多的条目时,仍然需要花费相当长的时间。我不是一个有经验的java用户,所以我总是认为java设计者的考虑超出了我的认知能力。类似redis的渐进式重灰化可以有效地将工作负载分配给hashmap中的每个put、delete或get,这可以显著减少重设大小/重灰化时间。我还比较了两种哈希方法,在我看来,这两种方法并没有限制jdk进行逐步的重新哈希。希望有人能给点线索或启发。提前多谢了。
1条答案
按热度按时间izj3ouym1#
如果你考虑一下像这样的增量再灰化的成本和收益
HashMap
事实证明,成本并不是微不足道的,收益也不是你想要的那么大。逐渐地重新洗牌
HashMap
:平均多使用50%的内存,因为它需要在增量重放期间同时保留旧表和新表;和
每次操作的计算成本略高。也:
重新灰化仍然不是完全增量的,因为分配新的哈希表数组必须一次完成;所以
任何操作的渐近复杂性都没有改进。最后:
由于不可预测的gc暂停,几乎没有什么真正需要增量重灰化的东西可以在java中实现,所以为什么要费心呢?