在调用LinkedHashMap的put()方法之后,如何在'之前'和'之后'更新变量?

my *_*YAN 3 java collections linkedhashmap

LinkedHashMap延伸HashMap.代码中put()不存在方法LinkedHashMap.java.所以我认为如果我可以put()在下面的程序中调用方法,那么它必须是从中继承的put()方法HashMap.

import java.util.*;
class First
{
        public static void main(String[] args)
        {
                LinkedHashMap<Key, String> h=new LinkedHashMap<>(7);
                h.put(new Key(3), "Hi");
                h.put(new Key(1), "Hello");
                h.put(new Key(9), "hru");
                System.out.println(h);
        }
}
Run Code Online (Sandbox Code Playgroud)

Key.java是:

class Key
{
        int i = 0;
        Key(int i)
        {
                this.i=i;
        }
        public int hashCode()
        {
                return i;
        }
        public String toString()
        {
                return i+"";
        }
}
Run Code Online (Sandbox Code Playgroud)

它必须维护'after'和'before'引用以保留插入顺序:http://a.disquscdn.com/uploads/mediaembed/images/3751/7481/original.jpg

但是put()方法in HashMap不知道这些变量.那么如何调用put()维护这些变量呢?

我也找不到createEntry()方法HashMapLinkedHashMap代码.

我在用:

java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 6

有所谓的(间接)回调方法通过HashMap诸如操作putremoveLinkedHashMap覆盖:

// Callbacks to allow LinkedHashMap post-actions
void afterNodeAccess(Node<K,V> p) { }
void afterNodeInsertion(boolean evict) { }
void afterNodeRemoval(Node<K,V> p) { }
Run Code Online (Sandbox Code Playgroud)

这允许LinkedHashMap维护双重链接的条目列表,这些条目对此HashMap一无所知.

除了那些方法,LinkedHashMap覆盖newNode()返回一个LinkedHashMap.Entry包含beforeafter引用的实例.

编辑:

看到你的Keys课程,你似乎忘记了覆盖equals,这意味着你可以添加重复的密钥LinkedHashMap.