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