Как LinkedHashMap работает внутри?

Я читал о LinkedHashMapи из описания (хотя и очень интересного) я не мог понять, как он на самом деле выполняет свою работу под капот. Кстати, я знаю, как HashMapработает в Java.
Поэтому я просматриваю источник и до сих пор не могу понять, как это работает. Возможно, в данном случае я не понимаю чего-то фундаментального в ООП, так что терпите меня.
Подводя итог части, которая меня смущает, является следующее:
LinkedHashMapделегирует все вызовы своему родительскому HashMap.
Внутренне он переопределяет HashMap.Entryдля реализации различных методов recordAccessи recordRemoval, которые реализуют логику LinkedHashMap
. фактические записинаходятся внутри таблицы базового класса, то есть HashMap, который создает экземпляр таблицы HashMap.Entry, а не LinkedHashMap.Entry. ].
Поэтому я не могу понять, как на самом деле вызываются различные recordAccess и recordRemove и т. д.
Так может ли кто-нибудь помочь мне понять, что здесь происходит?
Правильно ли я думаю, что каким-то образом LinkedHashedMap.Entryявляется типом таблицы, созданной HashMap? Но как?

ОБНОВЛЕНИЕ:
Мой вопрос заключается в том, как вызывается recordAccess . Мой эксперимент по этому поводу с использованием производной версии HashMapне удался по причине Shengyuan Lu (+1) - Плохо там

ОБНОВЛЕНИЕ:
Следующее, что я пробовал, то же самое (я думаю ) как то, что делает LinkedHashMap:

package delete;  

public class Base {  

    Entry[] 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 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 extends Base {  

    static class Entry extends Base.Entry{  

        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 b = new Derived();  
        b.add("Test string");  

    }  

}  

Но он печатает:

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

Таким образом, производная Entryникогда не вызывается.
Мой пример чем-то отличается? Я не могу понять, как это работает для LinkedHashMap

8
задан Flimzy 6 June 2018 в 16:28
поделиться