1

weakhashmapのJavaドキュメントによると:

「このクラスは主に、equals メソッドが == 演算子を使用してオブジェクトの同一性をテストするキー オブジェクトで使用することを目的としています。一度そのようなキーが破棄されると、二度と再作成できないため、WeakHashMap でそのキーのルックアップを行うことは不可能です。 "

これは、weakhashmap のエントリ 0 のキーとして objectA を使用し、後でそのエントリを削除すると、別のエントリtestMapHashWeak.remove(objectA);に同じキーobjectAを使用できないということですか? 私は小さなテストを行ったので、それを行うことができます:

    public void test4WeakHashMap(WeakHashMap<B, String> testMapHashWeak) {
    B objectB = new B();
    String sTest = "hola";
    System.out.println("1st time - key&value inserted ->"+objectB+","+sTest);
    testMapHashWeak.put(objectB, sTest);
    System.out.println("Get element 1st time-> "+testMapHashWeak.get(objectB));
    testMapHashWeak.remove(objectB);
    //Insert 2nd time
    System.out.println("2st time - key&value inserted ->"+objectB+","+sTest);
    testMapHashWeak.put(objectB, sTest);        
    System.out.println("Get element 2nd time-> "+testMapHashWeak.get(objectB));
}

出力であること:

1st time - key&value inserted ->B@634e3372,hola
Get element 1st time-> hola
2st time - key&value inserted ->B@634e3372,hola
Get element 2nd time-> hola
4

2 に答える 2

1

その文の「破棄」とは、「キー オブジェクトが通常の使用ではなくなった」こと、つまりライブ オブジェクトではないことを意味します。これは、 methodobjectBのスコープ全体で使用されているyour には当てはまりません。test4WeakHashMap

同じドキュメントから:

WeakHashMap のエントリは、そのキーが通常使用されなくなったときに自動的に削除されます。より正確には、特定のキーのマッピングが存在しても、キーがガベージ コレクターによって破棄されること、つまり、ファイナライズ可能になり、ファイナライズされてから再利用されることを防ぐことはできません。キーが破棄されると、そのエントリは事実上マップから削除されるため、このクラスは他の Map 実装とは多少異なる動作をします。

「ガベージコレクターによって破棄される」ことに注意してください。したがって、「マップから削除する」ことは「破棄する」ことと同じではありません。

于 2013-05-31T09:22:23.850 に答える
1

説明:

このクラスは主に、equals メソッドが == 演算子を使用してオブジェクトの同一性をテストするキー オブジェクトで使用することを目的としています。このようなキーは破棄されると再作成できないため、WeakHashMap でそのキーを検索することはできません。

は、このクラスがキーと一緒に使用することを意図していることを意味します。これらのキーは、再生成 (まったく同じインスタンスを新しく作成) した後、互いに比較すると false を返します。言い換えれば、そのようなキーの各新しいインスタンスは一意になります (使用equals()してそれ自体と比較した場合にのみ true を返し、他のインスタンス/オブジェクトと比較した場合に false を返します) たとえば、Stringis はそのような種類のクラスではありませんObject:

WeakHashMap testMapHashWeak = new WeakHashMap<Object, String>();

String value1 = "Hola1!";
String value2 = "Hola2!";

String key1 = new String("key");
String key2 = new String("key");

assert key1 != key2; // Keys are different objects...
assert key1.equals(key2); // but are equal to each other

testMapHashWeak.put(key1, value1);
testMapHashWeak.put(key2, value2);

// value2 instead of value1!
System.out.println("Get using key1 (expected Hola1): "+testMapHashWeak.get(key1));
// value2
System.out.println("Get using key2 (expected Hola2): "+testMapHashWeak.get(key2));

Object key3 = new Object();
Object key4 = new Object();

assert key3 != key4; // Keys are different objects...
assert !key3.equals(key4); // and are not equal to each other

testMapHashWeak.put(key3, value1);
testMapHashWeak.put(key4, value2);

// value2 instead of value1!
System.out.println("Get using key3 (expected Hola1):"+testMapHashWeak.get(key3)); // value1!
// value2
System.out.println("Get using key4 (expected Hola2):"+testMapHashWeak.get(key4));

WeakHashMap弱いキーを持つ Map の実装です。したがって、キーがガベージ コレクションされると、マップ内のエントリ全体 (キー、値) が失われます。ここでのキーワードは「後」です。これは、今すぐにという意味ではありません。そのため、キーが「GC によって削除される」とマークされ、実際に削除される前に、マップには取得できないはずのキーと値のエントリが含まれます。文字列ベースのキーを使用した最初の例では、別のキーを使用して値を取得できますが、値が存在するかどうかは予測できません (既に GCd されている可能性があります)。2 番目の例では、いずれにしてもできません。

于 2013-05-31T09:36:56.077 に答える