Cra*_*lus 8 java oop collections dictionary hashmap
我读到LinkedHashMap和描述(虽然非常有趣)我无法理解它是如何实际完成它的工作的.作为旁注,我知道HashMapJava中的工作原理.
所以我查看了源代码,仍然无法弄清楚它是如何工作的.也许在这种情况下我并没有抓住OOP的基本内容所以请耐心等待.
来概括,那会搞乱我的部分是:
将LinkedHashMap代表所有其父的电话HashMap.
在内部它覆盖HashMap.Entry来实现各种recordAccess与recordRemoval这似乎实现的逻辑方法,LinkedHashMap
但实际Entries是基类的表内即HashMap该实例的表HashMap.Entry不和LinkedHashMap.Entry.
所以,我想不出如何使用各种recordAccess和recordRemove等实际上被调用.
那么有谁能帮我理解这里发生了什么?
我是否正确认为这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");
}
}
Run Code Online (Sandbox Code Playgroud)
但它打印:
In base
Entry::Base
In Entry base, doing something
Run Code Online (Sandbox Code Playgroud)
因此派生Entry从未被调用过.
我的例子是不同的?我无法理解这是如何工作的LinkedHashMap
如果你MyLinkedHashMap在 package 下定义java.util,它将编译;)
因为HashMap.HashEntry是包的可见性。
加:
我认为您困惑的主要问题是LinkedHashMap.Entry与HashMap.Entry。重点是LinkedHashMap.Entry是——一个HashMap.Entry。实际上HashMap.table将LinkedHashMap.Entry存储在LinkedHashMap中。
对于recordAccess和recordRemoval,它们都覆盖 HashMap.Entry 版本。您可以在 LinkedHashMap 和 HashMap 中找到引用。
此处合并注释:您的示例代码与实现不同LinkedHashMap。请参阅LinkedHashMap.addEntry()。
| 归档时间: |
|
| 查看次数: |
1515 次 |
| 最近记录: |