我正在研究如何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
所在的位置在链表开头插入新节点的操作,即使 e
为 null
(即根本没有冲突并且创建的 条目
是第一个具有给定bucketIndex
的条目。
关于java - 这是什么意思? Entry<K,V> e = 表[bucketIndex];,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60516123/