java - LinkedHashMap 是如何工作的?

标签 java oop dictionary collections hashmap

我读到了 LinkedHashMap从描述中(虽然非常有趣)我无法理解它实际上是如何在引擎盖下工作的。作为旁注,我知道如何 HashMap在 Java 底层工作。
所以我查看了源代码,但仍然无法弄清楚它是如何工作的。在这种情况下,我可能没有掌握 OOP 的一些基本知识,所以请耐心等待。
总结一下让我困惑的部分如下:
LinkedHashMap将所有调用委托(delegate)给其父级 HashMap .
在内部它会覆盖 HashMap.Entry实现各种recordAccessrecordRemoval似乎实现了 LinkedHashMap 逻辑的方法
但实际Entries在基类的表内,即 HashMap实例化 HashMap.Entry 的表而不是 LinkedHashMap.Entry .
所以我无法弄清楚各种 recordAccessrecordRemove etc 实际上被调用了。
那么有人可以帮助我了解这里发生了什么吗?
我以某种方式认为 LinkedHashedMap.Entry 是否正确?是 HashMap 创建的表的类型?但是怎么办?

更新:
我的问题是如何做 recordAccess正在被调用。我使用 HashMap 的派生版本对此进行了实验由于陆盛元 (+1) 的原因而失败了 - 我那里不好

更新:
我尝试的以下内容与 LinkedHashMap 相同(我认为)正在做:

package delete;  

public class Base<T> {  

    Entry<T>[] table;  
    int idx = 0;  
    @SuppressWarnings("unchecked")  
    public Base(){  
        System.out.println("In base");  
        table = new Entry[10];  
    }

    public void add(T x){  
        table[idx] = new Entry(x);  
        table[idx].doSomething();  
    }  

    static class Entry<T>{  
        T value;  

        Entry(T x){  
            this.value = x;  
            System.out.println("Entry::Base");  
        }

        void doSomething(){  
            System.out.println("In Entry base, doing something");  
        }  
    }  

}  




public class Derived<T> extends Base<T> {  

    static class Entry<T> extends Base.Entry<T>{  

        Entry(T x) {  
            super(x);  
            System.out.println("In Entry derived");  
        }  

        int val;  

        @Override  
        void doSomething() {  
            System.out.println("In Entry derived doing something really smart!");  
        }       
    }  

    /**
     * @param args
     */
    public static void main(String[] args) {  

        Base<String> b = new Derived<String>();  
        b.add("Test string");  

    }  

}  

但它打印:

In base  
Entry::Base     
In Entry base, doing something    

所以导出Entry永远不会被调用。
我的例子有什么不同吗?我不明白这对 LinkedHashMap 是如何工作的|

最佳答案

如果你在包java.util下定义了MyLinkedHashMap,它会编译;)

因为HashMap.HashEntry是包可见性。

加上:

我认为让您感到困惑的主要问题是 LinkedHashMap.EntryHashMap.Entry。重点是LinkedHashMap.Entry is-a HashMap.Entry。实际上HashMap.table存储的是LinkedHashMap中的LinkedHashMap.Entry

关于recordAccessrecordRemoval,它们都覆盖了HashMap.Entry 版本。您可以在 LinkedHashMap 和 HashMap 中找到引用。

在此处合并评论:您的示例代码与 LinkedHashMap 实现不同。请参阅 LinkedHashMap.addEntry()

关于java - LinkedHashMap 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870319/

相关文章:

python - 字典的元组列表

c# - 如何在没有值的情况下将键添加到字典中?

java - Java中的线程优先级

java - 从依赖 jar 中找不到类

java - 如何使用 Mockito 验证对接口(interface)的调用?

javascript - 为什么对方法使用原型(prototype)而不是 this.methodName

objective-c - 检查 Objective-C block 类型?

python-3.x - 将 pandas 数据框转换为列表字典

java - 在 Java Poi (Excel) 中更改单元格格式(长度?)

C++ 对象表示