【发布时间】:2012-06-07 21:03:55
【问题描述】:
我读到了关于LinkedHashMap 的信息,并且从描述中(虽然很有趣)我无法理解它实际上是如何在幕后工作的。作为旁注,我知道 HashMap 在 Java 中是如何工作的。
所以我查看了源代码,但仍然无法弄清楚它是如何工作的。在这种情况下,也许我没有掌握 OOP 中的一些基本知识,所以请耐心等待。
总结一下让我感到困惑的部分如下: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 是如何工作的
【问题讨论】:
-
受保护还是包私有?
-
forLinkedHashMap为什么定义为extendsHashMap实现Map阅读this
-
@Pshemo:谢谢。在解释了您的链接后,我更新了 OP。现在我需要的只是解决我的核心问题
标签: java oop dictionary collections hashmap