java - 这是什么意思? Entry<K,V> e = 表[bucketIndex];

标签 java hashmap

我正在研究如何HashMap在里面工作,无法理解这个方法:

void addEntry(int hash, K key, V value, int bucketIndex) {
        Entry<K,V> e = table[bucketIndex];
        table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
        if (size++ >= threshold)
            resize(2 * table.length);

为什么反对 e 获取 table[bucketIndex] 的地址(或者这里发生了什么?)然后这个table[bucketIndex]获取新的Entry(hash, key, value, <strong>e</strong>) ?原因是什么,为什么不直接使用下面的内容?

Entry<K,V> e = new Entry<K,V>(hash, key, value)
table[bucketIndex] = e;

最佳答案

因为 HashMap 中可能存在冲突(即产生相同 bucketIndex 的不同键)。如果他们按照您的建议操作,那么在发生碰撞的情况下,最后插入的元素将删除先前的元素,这可能是以一种几乎不可预测的方式。

Entry 是作为某种链表实现的,因此它实际上有点命名错误,实际上是条目链表的一个节点。这就是为什么 e 作为 Entry 构造函数的最后一个参数传递的原因。

创建一个新的 Entry 来引用前一个条目(e)并将其添加到 e 所在的位置在链表开头插入新节点的操作,即使 enull(即根本没有冲突并且创建的 条目是第一个具有给定bucketIndex的条目。

关于java - 这是什么意思? Entry<K,V> e = 表[bucketIndex];,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60516123/

相关文章:

java - JPanel 没有在 setSize 方法中设置大小

java - 不必要的长正则表达式

java - 解析csv文件并在java集合hashmap中显示特定信息

java - 通过获取用户的输入来使用 Map<Integer,Integer>

java - ANT Build - 签名 APK 签名问题

java - 使用java pdfbox 2.0.2编写项目符号字符

java - 使用正则表达式拆分 SQL Select 语句

arrays - Perl在输入条件之前更改条件内的值?

java - 在 Java 中合并 2 个 HashMap

grails - 如何在Grails中访问hashMap