【问题标题】:How 'before' and 'after' variables gets updated after call of put() method of LinkedHashMap?调用 LinkedHashMap 的 put() 方法后如何更新“之前”和“之后”变量?
【发布时间】:2016-08-15 10:37:05
【问题描述】:

LinkedHashMap 扩展 HashMapLinkedHashMap.java 代码中不存在方法 put()。所以我认为如果我可以在下面的程序中调用put()方法,那么它一定是继承自HashMapput()方法。

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()维护这些变量呢?

我在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)

【问题讨论】:

    标签: java collections linkedhashmap


    【解决方案1】:

    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

    【讨论】:

    • @KevinEsche Keys 类刚刚添加到问题中,我将编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多