gpt4 book ai didi

Java HashMap 内部

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:42:04 25 4
gpt4 key购买 nike

我对 Java HashMap 类几乎没有怀疑。据我了解

 transient Entry[] table;

表数组将根据 hashCode() 的值保存数据。我需要知道这个数组何时被初始化。数组长度是根据我们在HashMap初始化时定义的容量还是调用构造函数时没有定义的默认容量16?

哈希码是如何缩放到数组索引的?例如,如果哈希码有一个巨大的值,它如何缩放到数组索引,如 10、20?

我读到当达到阈值时,将发生重新散列。例如,在默认情况下,当容量为16,负载因子为0.75时,则阈值为16*0.75=12。一旦添加了 12 个项目,就会发生重新散列,容量也会增加。这是否意味着 table 数组大小增加了?

最佳答案

由于您的帖子有很多问题,我将列举您的问题作为我回答的一部分。另外,请注意我要走了 HashMap's source code for Java 1.8 b132为我的答案。

  1. 问:我需要知道这个数组什么时候初始化的。
    答:table 数组仅在数据首次输入 map 时(例如 put() 方法调用)才会初始化。它不会作为 map 实例化本身的一部分发生,除非调用复制构造函数,或者 map 被反序列化为对象。
  2. 问:数组长度是根据我们在HashMap初始化时定义的容量还是调用构造函数时没有定义默认容量16?
    A: 正确,table 数组的长度取决于您传递给构造函数的初始容量。当不指定初始容量,调用默认构造函数时,使用默认容量。
  3. 问:哈希码是如何缩放到数组索引的?
    答:有关执行此操作的实际代码本身,请参阅 implementation of the putVal() method .基本上发生的事情是代码采用非常大的散列值并与表的最后一个元素索引执行按位与。这有效地随机化了键/值对与 table 数组的位置。例如,如果散列值为 333(基数为 2 的 101001101)并且 table 数组大小为 32(100000),则最后一个元素索引将为 31(11111)。因此,选择的索引将是 11111 & 101001101 == 01101 == 13
  4. 问:我读到当达到阈值时,将进行重新散列。 ...这是否意味着表数组大小增加了?
    A:或多或少,是的。当超过 threshold 时,表格会调整大小。请注意,通过调整大小,不会修改现有的 table 数组。相反,将创建一个新的 table 数组,其容量是第一个 table 数组的两倍。有关详细信息,请参阅 implementation of the resize() method .

关于Java HashMap 内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34804752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com