我读到了 LinkedHashMap从描述中(虽然非常有趣)我无法理解它实际上是如何在引擎盖下工作的。作为旁注,我知道如何 HashMap
在 Java 底层工作。
所以我查看了源代码,但仍然无法弄清楚它是如何工作的。在这种情况下,我可能没有掌握 OOP 的一些基本知识,所以请耐心等待。
总结一下让我困惑的部分如下:
LinkedHashMap
将所有调用委托(delegate)给其父级 HashMap
.
在内部它会覆盖 HashMap.Entry
实现各种recordAccess
和 recordRemoval
似乎实现了 LinkedHashMap
逻辑的方法
但实际Entries
在基类的表内,即 HashMap
实例化 HashMap.Entry
的表而不是 LinkedHashMap.Entry
.
所以我无法弄清楚各种 recordAccess
和 recordRemove
etc 实际上被调用了。
那么有人可以帮助我了解这里发生了什么吗?
我以某种方式认为 LinkedHashedMap.Entry
是否正确?是 HashMap
创建的表的类型?但是怎么办?
更新:
我的问题是如何做 recordAccess
正在被调用。我使用 HashMap
的派生版本对此进行了实验由于陆盛元 (+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
是如何工作的|
最佳答案
如果你在包java.util
下定义了MyLinkedHashMap
,它会编译;)
因为HashMap.HashEntry
是包可见性。
加上:
我认为让您感到困惑的主要问题是 LinkedHashMap.Entry 与 HashMap.Entry。重点是LinkedHashMap.Entry is-a HashMap.Entry。实际上HashMap.table存储的是LinkedHashMap中的LinkedHashMap.Entry
关于recordAccess
和recordRemoval
,它们都覆盖了HashMap.Entry 版本。您可以在 LinkedHashMap 和 HashMap 中找到引用。
在此处合并评论:您的示例代码与 LinkedHashMap
实现不同。请参阅 LinkedHashMap.addEntry()
。
关于java - LinkedHashMap 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870319/