我读到了LinkedHashMap和描述(虽然很有趣),但我无法理解它实际上是如何在幕后工作的。作为旁注,我知道 aHashMap
在 Java 中是如何工作的。
所以我查看了源代码,但仍然无法弄清楚它是如何工作的。在这种情况下,也许我没有掌握 OOP 中的一些基本知识,所以请耐心等待。
总结一下让我感到困惑的部分如下:
将LinkedHashMap
所有调用委托给它的 parent HashMap
。
在内部,它覆盖了实现似乎实现逻辑的HashMap.Entry
各种方法recordAccess
,
但实际在基类的表中,即recordRemoval
LinkedHashMap
Entries
HashMap
它实例化了一个表HashMap.Entry
而不是LinkedHashMap.Entry
.
所以我无法弄清楚各种recordAccess
等等recordRemove
实际上是如何被调用的。
那么任何人都可以帮助我了解这里发生了什么吗?
我是否正确地认为这LinkedHashedMap.Entry
是由创建的表的类型HashMap
?但是怎么做?
更新:
我的问题是如何recordAccess
被调用。HashMap
由于Shengyuan Lu(+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