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

Java 如何';在'之前;和';在'之后;在调用LinkedHashMap的put()方法后更新变量?,java,collections,linkedhashmap,Java,Collections,Linkedhashmap,LinkedHashMap扩展了HashMap。方法put()不在LinkedHashMap.javacode中。所以我认为,如果我可以在下面的程序中调用()(代码)>代码>方法,那么它必须继承 >()>代码>方法,从 HashMap < /代码> ./p> import java.util.*; class First { public static void main(String[] args) { LinkedHashMap

LinkedHashMap
扩展了
HashMap
。方法
put()
不在
LinkedHashMap.java
code中。所以我认为,如果我可以在下面的程序中调用<代码>()(代码)>代码>方法,那么它必须继承<代码> >()>代码>方法,从<代码> HashMap < /代码> ./p>
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);
        }
}
它必须保留“after”和“before”引用以保留插入顺序:

但是
HashMap
中的
put()
方法不知道这些变量。那么如何调用
put()
来维护这些变量呢

我在
HashMap
LinkedHashMap
代码中也找不到
createEntry()
方法

我正在使用:

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)

HashMap
操作(间接)调用了一些回调方法,例如
put
remove
,它们将
LinkedHashMap
覆盖:

// Callbacks to allow LinkedHashMap post-actions
void afterNodeAccess(Node<K,V> p) { }
void afterNodeInsertion(boolean evict) { }
void afterNodeRemoval(Node<K,V> p) { }
//允许LinkedHashMap post操作的回调
节点访问后无效(节点p){}
void afterNodeInsertion(布尔逐出){}
void afterNodeRemoval(Node p){}
这允许
LinkedHashMap
维护条目的双链接列表,而
HashMap
对此一无所知

除了这些方法之外,
LinkedHashMap
重写
newNode()
以返回
LinkedHashMap.Entry
的实例,其中包含
之前的
引用和
之后的

编辑:


看到您的
Keys
类,您似乎忘记覆盖
equals
,这意味着您可以向
LinkedHashMap

@kevinesch添加重复的键。Keys类刚刚添加到问题中,我将编辑我的答案。
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);
        }
}