我读到了LinkedHashMap的相关描述,虽然很有趣,但我不理解它在底层是如何工作的。顺便说一句,我知道Java中
HashMap
的底层实现。于是我查看了源代码,但仍然无法理解它的工作原理。也许我在面向对象编程方面没有掌握某些基础知识,请耐心指点。
总结起来,让我困惑的部分如下:
LinkedHashMap
将所有调用委托给其父类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
是如何工作的。