“再一次問好!”

“現在我要告訴你一件更美妙的事情: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避免死亡的對象將無法在下一次垃圾收集中存活下來。但在此之前,您可以通過調用 Wea​​kReference 上的 get() 方法來獲取該對象,然後調用其方法或對其執行其他操作”

“如果對象同時被 SoftReference 和 WeakReference 引用怎麼辦?”

“這很簡單。如果至少有一個常規引用指向一個對象,它就被認為是活著的。順便說一下,這樣的引用稱為 StrongReference。”

“如果沒有常規引用指向一個對象,但 SoftReference 指向一個對象,那麼它就是軟可達的。”

“如果沒有常規引用或 SoftReferences 指向一個對象,但 WeakReference 指向一個對象,那麼它就是弱可達的。”

“想一想。SoftReference 保護對像不被刪除,並確保只有在內存不足時才會刪除對象。WeakReference 持有對象直到下一次垃圾收集。SoftReference 提供更大的刪除阻力。”

“啊。我想我明白了。”

“太好了,那我將告訴你另一個與 WeakReferences 有關的有趣的事情——WeakHashMap。”

“聽起來很嚴重!”

“然後是一些!WeakHashMap 是一個 HashMap,其鍵是弱引用 (WeakReferences)。”

“也就是說,您將對象添加到這樣的 HashMap 中並使用它們。一切照常。”

“只要您存儲在 WeakHashMap 中的對象具有常規(強或軟)引用作為鍵,這些對象就會存在。”

“但是假設在整個應用程序中不再有對這些對象的引用。所有讓它們不死的就是WeakHashMap內部的一些WeakReferences。在下一次垃圾收集之後,這些對象將從WeakHashMap中消失。他們自己。就像他們一樣從來沒有在那裡。”

“我不確定我是否理解。”

“您在 WeakHashMap 中存儲對像對:一個鍵和一個值。但是 WeakHashMap 不直接引用鍵,而是通過 WeakReferences。因此,當用作鍵的對像變得弱可達時,它們將在下一次銷毀垃圾回收。因此,它們的值也會自動從 WeakHashMap 中刪除。”

“使用 Wea​​kHashMap 存儲有關某些對象的附加信息非常方便。”

“首先,如果您使用對象本身作為密鑰,則訪問信息非常容易。”

“其次,如果對像被銷毀,它會連同所有相關數據一起從 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 中,鍵存儲為 WeakReferences。”
  2. “一旦用戶對像被垃圾收集器銷毀,remove(user) 方法就會在 WeakHashMap 中隱式調用,並且與用戶對象相關的任何信息都會自動從 WeakHashMap 中刪除。”

“這看起來是個強大的工具,我可以在哪裡使用它?”

“這取決於具體情況。假設您在程序中有一個線程跟踪某些由對象表示的任務的工作,並將有關它們的信息寫入日誌。該線程可以將受監視的對象存儲在 WeakHashMap 中。盡快由於不需要這些對象,垃圾收集器會刪除它們,並且對它們的引用也會自動從 WeakHashMap 中刪除。”

“聽起來很有趣。我已經覺得我還沒有編寫任何利用這種強大機制的嚴肅 Java 程序。但我會朝著那個方向努力。非常感謝,Ellie,給我上了這麼有趣的一課。”