java - 调用 LinkedHashMap 的 put() 方法后如何更新 'before' 和 'after' 变量?

标签 java collections linkedhashmap

LinkedHashMap 扩展 HashMapLinkedHashMap.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+"";
        }
}

它必须维护“之后”和“之前”的引用以保留插入顺序:http://a.disquscdn.com/uploads/mediaembed/images/3751/7481/original.jpg

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

我在 HashMapLinkedHashMap 代码中也找不到 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 操作(例如 putremove 调用(间接)回调方法,LinkedHashMap 覆盖:

// 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 的实例,其中包含 beforeafter 引用。

编辑:

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

关于java - 调用 LinkedHashMap 的 put() 方法后如何更新 'before' 和 'after' 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38953512/

相关文章:

java - 使用 twilio : The API package 'urlfetch' or call 'Fetch()' was not found 发送短信

java - ConcurrentHashMap 的迭代器给出奇怪的结果

collections - F# 中 list 和 [] 的区别

c# - 在 .NET 中创建阻塞 Queue<T>?

java - 如何防止LinkedHashMap替换Key/Value?

java - 如何将空 android 应用程序的大小减小到 1mb 以下

java - 为什么 ArrayList 通过特定公式扩展 elementData 数组?

java - JAVA/C++ 中尾随字符的使用

java - 为什么 @ResponseBody 返回已排序的 LinkedHashMap 未排序?

java - 在 ArrayList 内的 LinkedHashMap 中查找和赋值的替代方法