java中LinkedHashMap中的addEntry方法
最近我阅读了java中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
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中,第一个元素是标题的上一个元素,最高级是标题的下一个元素。