Я читал о 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