Hashtable rehash on remove

时间:2012-08-26 07:09:47

标签: java resize hashtable

有没有人知道为什么哈希表的java jdk实现在删除时不会重新表格?

如果空间使用率太低怎么办?这不是缩小尺寸和改造的理由吗?

就像加载因子0.75一样触发put上的rehash,我们可以在表的密度上有一个像0.25这样的下限(当然可以在这里用最好的值进行分析)并再次触发rehash,只要它的大小该表的大于initialCapacity。

2 个答案:

答案 0 :(得分:7)

Rehashing是一项昂贵的操作,基于java哈希的数据结构试图避免它。它们只在查找性能差时才进行重新散列。这是此类数据结构的目的:查找性能。

以下是来自HashMap java docs的引用:

  

在设置初始容量时,应考虑地图中预期的条目数及其加载因子,以便最大限度地减少重新扫描操作的次数。如果初始容量大于最大条目数除以负载因子,将不会发生任何重新连接操作。

     

如果要在HashMap实例中存储多个映射,那么以足够大的容量创建映射将允许映射更有效地存储,而不是根据需要执行自动重新散列来扩展表

除了这个论点之外,java创建者可能认为如果你的哈希表中有那么多元素,那么再次使用它们的可能性非常大,所以不需要重新表达两次表。

答案 1 :(得分:2)

您应该询问Sun / Oracle工程师,以了解为什么没有减小尺寸的阈值。

这是我的两分钱:

  • 重复表格需要时间
  • 检查每次删除操作需要时间

另一方面:

  • 可能你不会节省太多内存(表中的对象和节点将占用更多空间)
  • 可能没有很多场景首先你创建(一些)非常大的哈希表,然后清空它们并渴望使用未使用的空间。
  • 您知道包含该行为的任何流行实现(减少表格大小)

在生活中的编程中,有很多事情可以做。有些只是非常具体的案例。有些人根本不值得痛苦。