WeakHashMap は、対応するキーがプログラムのどのセクションからも参照されなくなった場合に、値オブジェクトのメモリを Grabage Collector によって再利用できる Map インターフェイスの実装です。そのため、キーがプログラムで使用されなくなった場合。その Entry オブジェクトは、その使用法に関係なくガベージ コレクションされます。ここまでクリア
これは、キーが参照されなくなっても値オブジェクトが HashMap に残る HashMap とは異なります。値を削除するには、HashMap オブジェクトで remove() メソッドを明示的に呼び出す必要があります。remove を呼び出すと、エントリがマップから削除されるだけです。GC の準備ができているかどうかは、プログラムのどこかでまだ使用されているかどうかによって異なります。
私の理解によると、HashMap に対する WeakHashMap の使用
私の理解では、プログラムのどのセクションでもキーが参照されなくなったときに、値オブジェクトがGrabage Collectorによって確実に回収されるようにしたい場合にのみ、WeakHashMapを使用する必要があります。これにより、プログラムのメモリが効率的になります。私の理解は正しいですか?
JavaDocsに従って WeakHashMap を使用すると、このステートメントを見つけることができます
このクラスは主に、equals メソッドが == 演算子を使用してオブジェクトの同一性をテストするキー オブジェクトで使用することを目的としています。
上記のステートメントの意味と、それが WeakHashMap の使用法に関する私の理解とどのように対照的であるかがわかりませんでした。実際、このステートメントが WeakHashMap の使用にどのように関連しているかわかりませんでしたか?
更新:- 以下のステートメントをさらに注意深く読んで、javadocs
WeakHashMap のエントリは、そのキーが通常使用されなくなったときに自動的に削除されます。より正確には、特定のキーのマッピングが存在しても、キーがガベージ コレクターによって破棄されること、つまり、ファイナライズ可能になり、ファイナライズされてから再利用されることを防ぐことはできません。キーが破棄されると、そのエントリは事実上マップから削除されるため、このクラスは他の Map 実装とは多少異なる動作をします。
私は自分と他の人の利益のために自分の理解を修正しています
私の改訂された理解によると、HashMapを介したWeakHashMapの使用
キーがマップ自体以外で通常使用されなくなったときに、GC 実行時にキーと値のペアがマップから確実に削除されるようにする場合にのみ、WeakHashMap を使用する必要があります。
例は次のとおりです:-
WeakHashMap<Integer, String> numbers = new WeakHashMap<Integer, String>();
numbers.put(new Integer(1), "one");// key only used within map not anywhere else
numbers.put(new Integer(2), "two");
System.out.println(numbers.get(new Integer(1))); // prints "one"
System.gc();
// let's say a garbage collection happens here
System.out.println(numbers.get(new Integer(1))); // prints "null"
System.out.println(numbers.get(new Integer(2))); // prints "null"
Object key = new Object();
m1.put(key, c1);
System.out.println(m1.size());
key = null or new Object() ; // privious key only used within map not anywhere else
System.gc();
Thread.sleep(100);
System.out.println(m1.size());