"Hello lagi!"

"Sekarang saya akan memberitahu anda tentang satu lagi perkara yang menarik: WeakReference ."

"Ia kelihatan hampir sama dengan SoftReference:"

Contoh
// 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();

"Rujukan yang lemah mempunyai satu lagi ciri khas."

"Jika objek tidak mempunyai rujukan biasa atau rujukan lembut, tetapi hanya rujukan yang lemah, maka objek itu masih hidup, tetapi ia akan dimusnahkan pada kutipan sampah seterusnya."

"Bolehkah anda mengatakan itu sekali lagi? Apakah perbezaan antara rujukan ini?"

"Objek yang disimpan daripada kematian hanya oleh SoftReference boleh bertahan seberapa banyak kutipan sampah yang anda suka dan mungkin akan dimusnahkan jika ingatan tidak mencukupi."

"Objek yang disimpan daripada kematian hanya oleh WeakReference tidak akan bertahan dalam kutipan sampah seterusnya. Tetapi sehingga itu berlaku, anda boleh mendapatkan objek dengan memanggil kaedah get() pada WeakReference dan kemudian memanggil kaedahnya atau melakukan sesuatu yang lain dengannya ."

"Bagaimana jika objek dirujuk oleh SoftReference dan WeakReference?"

"Itu mudah. ​​Jika sekurang-kurangnya satu rujukan biasa menunjuk kepada objek, ia dianggap hidup. By the way, rujukan sedemikian dipanggil StrongReference."

"Jika tiada rujukan biasa menunjuk kepada objek, tetapi SoftReference menunjukkannya, maka ia boleh dicapai dengan lembut."

"Jika tiada rujukan biasa atau SoftReferences menghala ke objek, tetapi WeakReference melakukannya, maka ia boleh dicapai dengan lemah."

"Fikirkanlah. SoftReference melindungi objek daripada dipadamkan dan memastikan objek akan dipadamkan hanya jika memori tidak mencukupi. WeakReference menahan objek sehingga pengumpulan sampah seterusnya. SoftReference menawarkan rintangan yang lebih besar terhadap pemadaman."

"Ah. Saya rasa saya faham."

"Bagus, kemudian saya akan memberitahu anda tentang satu lagi perkara menarik yang melibatkan WeakReferences — WeakHashMap."

"Serius bunyinya!"

"Dan kemudian beberapa! WeakHashMap ialah HashMap yang kuncinya adalah rujukan lemah (WeakReferences)."

"Iaitu, anda menambah objek pada HashMap sedemikian dan bekerjasama dengan mereka. Perniagaan seperti biasa."

"Selagi objek yang anda simpan dalam WeakHashMap mempunyai rujukan biasa (kuat atau lembut) sebagai kunci, objek ini akan hidup."

"Tetapi andaikan tiada lagi rujukan kepada objek ini dalam keseluruhan aplikasi. Semua yang menghalang mereka daripada mati ialah beberapa WeakReferences dalam WeakHashMap. Selepas pengumpulan sampah seterusnya, objek tersebut akan hilang daripada WeakHashMap. Dengan sendirinya. Seolah-olah mereka tidak pernah ada."

"Saya tidak pasti saya faham."

"Anda menyimpan pasangan objek dalam WeakHashMap: kunci dan nilai. Tetapi WeakHashMap tidak merujuk kekunci secara langsung, sebaliknya melalui WeakReferences. Oleh itu, apabila objek yang digunakan sebagai kunci menjadi lemah, ia akan dimusnahkan pada seterusnya pengumpulan sampah. Dan akibatnya, nilai mereka juga dialih keluar secara automatik daripada WeakHashMap."

"Sangat mudah untuk menggunakan WeakHashMap untuk menyimpan maklumat tambahan tentang objek tertentu."

"Pertama sekali, mengakses maklumat adalah sangat mudah jika anda menggunakan objek itu sendiri sebagai kunci."

"Kedua, jika objek dimusnahkan, ia akan hilang daripada HashMap bersama-sama dengan semua data yang berkaitan."

"Sebagai contoh:

Contoh
// 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. "Di dalam WeakHashMap, kunci disimpan sebagai WeakReferences."
  2. "Sebaik sahaja objek pengguna dimusnahkan oleh pengumpul sampah, kaedah buang(pengguna) dipanggil secara tersirat di dalam WeakHashMap dan sebarang maklumat yang berkaitan dengan objek pengguna dialih keluar daripada WeakHashMap secara automatik."

"Ini kelihatan seperti alat yang berkuasa. Di manakah saya boleh menggunakannya?"

"Itu bergantung pada keadaan. Katakan anda mempunyai benang dalam program yang menjejaki kerja beberapa tugasan, diwakili oleh objek dan menulis maklumat tentangnya pada log. Benang ini boleh menyimpan objek yang dipantau dalam WeakHashMap. Sebaik sahaja kerana objek tidak diperlukan, pengumpul sampah memadamnya, dan rujukan kepadanya juga dialih keluar secara automatik daripada WeakHashMap."

"Bunyinya menarik. Saya sudah berasa seperti saya belum lagi menulis sebarang program Java yang serius yang mengambil kesempatan daripada mekanisme yang begitu berkuasa. Tetapi saya akan berusaha ke arah itu. Terima kasih banyak, Ellie, untuk pelajaran yang begitu menarik."