【问题标题】:Resizing of array table in HashMap implementation在 HashMap 实现中调整数组表的大小
【发布时间】:2020-12-09 19:49:46
【问题描述】:

这是一个简单的问题,对于那些了解 HashMap 内部实现的人来说:)

初始大小为 16 个桶,负载因子为 0.75。这意味着当它得到(注意那个词)12 时,它的大小会调整为 32 个桶。

我的问题是,当它获得 12 个键值对或获得 12 个“填充”存储桶时,它是否会从 16 个存储桶调整到 32 个存储桶?我之所以这样问,是因为可能会从这 16 个存储桶中将所有 12 个键值对插入到同一个存储桶中。在这种情况下,调整大小会很奇怪,因为其他 15 个完全是空的。

谢谢,如有任何意见将不胜感激:)

【问题讨论】:

    标签: java hashmap bucket


    【解决方案1】:

    this link 中所述。

    表示hashmap的第12个key-value对将保持其大小为16。只要第13个元素(key-value pair)进入Hashmap,它的大小就会从默认增加2^4 = 16 个桶到 2^5 = 32 个桶。

    独立于每个key的插入位置,当负载因子和当前容量的乘积超过时,表格将被调整大小。

    HashMap 不关心在达到负载因子之前使用了多少个桶,它知道发生冲突的可能性变得太大,并且应该调整映射的大小。尽管已经发生了许多碰撞。

    【讨论】:

      【解决方案2】:

      来自 JavaDoc https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html#put-K-V-

      When the number of entries in the hash table exceeds the product of the load factor and the current capacity, the hash table is rehashed (that is, internal data structures are rebuilt) so that the hash table has approximately twice the number of buckets.

      所以,当 HashMap 有 12 个键值对时,它会调整大小。这并不奇怪,因为在调整条目大小后会改变它们的存储桶。

      【讨论】:

      • 但这是否意味着在调整大小时可能有 15 个空桶?意思是所有 12 都进入一个桶?你认识那个吗?当然感谢!
      • 嗨@AnaMaria,您可以在此处找到有关该问题的更多信息:stackoverflow.com/questions/44745811/…
      猜你喜欢
      • 2015-06-27
      • 2017-09-06
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2017-07-17
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多