LinkedHashMap如何在幕后工作?

Cra*_*lus 8 java oop collections dictionary hashmap

我读到LinkedHashMap和描述(虽然非常有趣)我无法理解它是如何实际完成它的工作的.作为旁注,我知道HashMapJava中的工作原理.
所以我查看了源代码,仍然无法弄清楚它是如何工作的.也许在这种情况下我并没有抓住OOP的基本内容所以请耐心等待.
来概括,那会搞乱我的部分是:
LinkedHashMap代表所有其父的电话HashMap.
在内部它覆盖HashMap.Entry来实现各种recordAccessrecordRemoval这似乎实现的逻辑方法,LinkedHashMap
但实际Entries是基类的表内即HashMap该实例的表HashMap.Entry不和LinkedHashMap.Entry.
所以,我想不出如何使用各种recordAccessrecordRemove等实际上被调用.
那么有谁能帮我理解这里发生了什么?
我是否正确认为这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");  

    }  

}  
Run Code Online (Sandbox Code Playgroud)

但它打印:

In base  
Entry::Base     
In Entry base, doing something    
Run Code Online (Sandbox Code Playgroud)

因此派生Entry从未被调用过.
我的例子是不同的?我无法理解这是如何工作的LinkedHashMap

卢声远*_* Lu 4

如果你MyLinkedHashMap在 package 下定义java.util,它将编译;)

因为HashMap.HashEntry是包的可见性。

加:

我认为您困惑的主要问题是LinkedHashMap.EntryHashMap.Entry。重点是LinkedHashMap.Entry是——一个HashMap.Entry。实际上HashMap.table将LinkedHashMap.Entry存储在LinkedHashMap中。

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

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