java中LinkedHashMap中的addEntry方法

java中LinkedHashMap中的addEntry方法,java,Java,最近我阅读了java中LinkedHashmap的源代码,我知道链接hashmap使用双链接来恢复条目。当addEntry时,它将删除列表中最老的键,但当我读取代码时,我遇到了一些问题 426 addEntry(int hash, K key, V value, int bucketIndex) { 427 super.addEntry(hash, key, value, bucketIndex); 428 429 // Remove eldest entry

最近我阅读了java中
LinkedHashmap
的源代码,我知道链接hashmap使用双链接来恢复条目。当
addEntry
时,它将删除列表中最老的键,但当我读取代码时,我遇到了一些问题

426    addEntry(int hash, K key, V value, int bucketIndex) {
427        super.addEntry(hash, key, value, bucketIndex);
428
429        // Remove eldest entry if instructed
430        Entry<K,V> eldest = header.after;
431        if (removeEldestEntry(eldest)) {
432            removeEntryForKey(eldest.key);
433        }
434    }
426加法器(整数散列、K键、V值、整数bucketIndex){
427超级加法器(散列、键、值、bucketIndex);
428
429//如果有指示,请删除最老的条目
430条目最长=页眉.after;
431 if(改造(最老)){
432远程入门(最年长的钥匙);
433        }
434    }

在第430行中,
eldest=header.after
,但我认为列表的末尾不是
header.after
,因为
header.after
是第二个条目

LinkedHashMap的代码随着时间的推移发生了变化,android的代码完全不同,所以我不确定是哪个版本。但是,在我看来,在第一个节点之前和最后一个节点之后都有“虚拟”节点是有意义的(这样即使是空的
LinkedHashMap
也有2个节点)。这样,您可以通过获取
X
之前和之后的节点,从地图中删除节点
X

X.before -> X -> X.after
并将
X.before
之后的新节点设置为
X.after
,将
X.after
之前的新节点设置为
X.before

X.before ------> X.after     (X has gone.)
这方面的代码可以是:

X.before.after = X.after;
X.after.before = X.before;
如果没有虚拟节点,则
X.before
X.before
X.before
中的一个或两个都可能是
null
,因此这会使此过程稍微难以编码


我见过使用这两个额外节点的
LinkedHashMap
版本,其他版本则没有。在中,第一个和最后一个“虚拟”节点(称为
)实际上是重复使用的同一对象

你能把
改造的代码也包括进来吗?
?对不起,我想你说的与我的问题没有联系。@ManZhang好的,你需要澄清你的问题。当前版本的
LinkedHashMap
根本不包含该代码。你能把你找到它的地方的链接包括进去吗?另外,我的答案也回答了你的问题。您已经说过,
header.after
是第二大条目,但它不是-它是第一个条目。这是因为
header
只是启动链的“虚拟”条目。地图中最老的“真实”条目是
标题。在
之后。谢谢,在linkedhashmap中,第一个元素是标题的上一个元素,最高级是标题的下一个元素。