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

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

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);
        }
}

Key.java是:

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

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

但是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操作调用(间接)调用回调方法,例如LinkedHashMap覆盖的put和remove:

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

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

除了这些方法之外,LinkedHashMap会覆盖newNode()以返回LinkedHashMap.Entry的实例,该实例包含引用之前和之后.

编辑:

看到您的Keys类,您似乎忘记了覆盖equals,这意味着您可以向LinkedHashMap添加重复的键.

上一篇:java – 在实例化地图列表时获取’类型不匹配:无法从ArrayList>转换为List>’


下一篇:java – 什么是LinkedHashMap以及它用于什么?