"またあったね!"

「ここで、もう 1 つの素晴らしいことについてお話します。それは、WeakReference です。」

「SoftReference とほぼ同じに見えます。」

// Create a Cat object
Cat cat = new Cat();

// Create a weak reference to a Cat object
WeakReference<Cat> catRef = new WeakReference<Cat>(cat);

// Now only the catRef weak reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the weak reference
catRef.clear();

「弱参照にはもう一つ特別な特徴があります。」

「オブジェクトに通常の参照やソフト参照がなく、弱い参照しかない場合、オブジェクトは生きていますが、次のガベージ コレクションで破棄されます。」

「もう一度言ってもらえますか?これらの参照の違いは何ですか?」

「 SoftReferenceによってのみ死から守られているオブジェクトは、好きなだけガベージ コレクションを乗り越えることができますが、メモリが不十分な場合はおそらく破壊されます。」

「 WeakReferenceによってのみ死から守られていたオブジェクトは、次のガベージ コレクションでは生き残れません。しかし、そうなるまでは、 WeakReferenceで get() メソッドを呼び出してオブジェクトを取得し、その後そのメソッドを呼び出すか、それに対して何か他のことを行うことができます。 。」

「オブジェクトが SoftReference と WeakReference の両方によって参照されている場合はどうなるでしょうか?」

「それは簡単です。少なくとも 1 つの通常の参照がオブジェクトを指していれば、そのオブジェクトは生きていると見なされます。ちなみに、そのような参照は StrongReference と呼ばれます。」

「通常の参照がオブジェクトを指しておらず、SoftReference がオブジェクトを指している場合、そのオブジェクトはソフトに到達可能です。」

「通常の参照または SoftReference がオブジェクトを指しておらず、WeakReference がオブジェクトを指している場合、そのオブジェクトは弱く到達可能です。」

「考えてみてください。SoftReference はオブジェクトが削除されないように保護し、メモリが不足している場合にのみオブジェクトが削除されるようにします。WeakReference は次のガベージ コレクションまでオブジェクトを保持します。SoftReference は削除に対する耐性が高くなります。」

「ああ、わかる気がする」

「わかりました。それでは、WeakReferences に関連するもう 1 つの興味深いこと、WeakHashMap についてお話します。」

「真剣そうですね!」

「それからいくつか! WeakHashMap は、キーが弱い参照 (WeakReferences) である HashMap です。」

「つまり、そのような HashMap にオブジェクトを追加して、それらを操作します。通常どおりです。」

「WeakHashMap に保存したオブジェクトがキーとして通常の (強いまたはソフトな) 参照を持っている限り、これらのオブジェクトは生き続けます。」

「しかし、アプリケーション全体でこれらのオブジェクトへの参照がなくなったとします。オブジェクトが死なないようにしているのは、WeakHashMap 内のいくつかの WeakReference だけです。次のガベージ コレクションの後、そのようなオブジェクトは WeakHashMap から消えます。それ自体で。あたかもそれらが存在するかのようにそこには決していなかった。」

「理解できたかどうかわかりません。」

「WeakHashMap にはオブジェクトのペア (キーと値) を格納します。しかし、WeakHashMap はキーを直接参照するのではなく、WeakReferences を通じて参照します。したがって、キーとして使用されるオブジェクトが弱く到達可能になると、それらのオブジェクトは次の時点で破棄されます。」ガベージ コレクション。その結果、それらの値も WeakHashMap から自動的に削除されます。」

「特定のオブジェクトに関する追加情報を保存するために WeakHashMap を使用すると非常に便利です。」

「まず、オブジェクト自体をキーとして使用すると、情報へのアクセスが非常に簡単になります。」

「第二に、オブジェクトが破棄されると、そのオブジェクトは関連するすべてのデータとともに HashMap から消えます。」

"例えば:

// Create an object to store additional information about the user
WeakHashMap<User, StatisticInfo> userStatistics = new WeakHashMap<User, StatisticInfo>();

// Put information about the user into userStatistics
User user = session.getUser();
userStatistics.put(user, new StatisticInfo (…));

// Get information about the user from userStatistics
User user = session.getUser();
StatisticInfo statistics = userStatistics.get(user);

// Remove any information about the user from userStatistics
User user = session.getUser();
userStatistics.remove(user);
  1. 「WeakHashMap 内では、キーは WeakReference として保存されます。」
  2. 「ユーザー オブジェクトがガベージ コレクターによって破棄されるとすぐに、remove(user) メソッドが WeakHashMap 内で暗黙的に呼び出され、ユーザー オブジェクトに関連付けられた情報はすべて WeakHashMap から自動的に削除されます。」

「これは強力なツールのようですが、どこで使用できますか?」

「それは状況によって異なります。オブジェクトで表されるいくつかのタスクの作業を追跡し、それらに関する情報をログに書き込むプログラム内にスレッドがあるとします。このスレッドは、監視対象のオブジェクトを WeakHashMap に保存できます。オブジェクトは不要なため、ガベージ コレクターによって削除され、それらへの参照も WeakHashMap から自動的に削除されます。」

「面白そうですね。これほど強力なメカニズムを利用する本格的な Java プログラムをまだ書いていないような気がします。でも、それに向けて努力していきます。エリー、とても興味深いレッスンをありがとう。」