【发布时间】:2017-08-01 14:38:49
【问题描述】:
我在看LinkedHashMap的源码,addBefore方法让我很困惑:
private void addBefore(Entry<K,V> existingEntry) {
after = existingEntry;
before = existingEntry.before;
before.after = this;
after.before = this;
}
这个方法在createEntry方法中被调用:
void createEntry(int hash, K key, V value, int bucketIndex) {
HashMap.Entry<K,V> old = table[bucketIndex];
Entry<K,V> e = new Entry<>(hash, key, value, old);
table[bucketIndex] = e;
e.addBefore(header);
size++;
}
很明显,传递给addBefore方法的参数始终是header entry,所以addBefore方法中的after变量始终是header entry。此外,头节点永远不会改变。
我的问题是 addBefore 方法是如何形成双向链表的?
【问题讨论】:
-
我不清楚
this是如何分配自己的after和before指针的。我想如果你能解释一下,那么你的问题就会得到答案。 -
画几张图就明白了。如果你想在
Node之前插入,你知道Node和Node在它前面插入它们之间。existingEntry是您要在之前添加新的Node的Node。所以在existingEntry之前找到Node。这个Node是existingEntry.before。现在将新的Node链接到'Node' 的末尾,在addBeforeNode and to the beginning of the addBeforeNode 之前。 -
@SedrickJefferson 你的解释缺少一些东西;这可能是 OP 感到困惑的地方。
-
我同意@TimBiegeleisen。我认为一个图表可以很好地解释这一点。
标签: java linkedhashmap