Dalam tutorial ini, kita akan belajar mengenai Java WeakHashMap dan operasinya dengan bantuan contoh. Kami juga akan mengetahui perbezaan antara WeakHashMap dan HashMap
The WeakHashMap
kelas rangka koleksi Java menyediakan ciri-ciri struktur data jadual hash …
Ia melaksanakan antara muka Peta.
Catatan : Kunci hashmap yang lemah adalah jenis WeakReference .
Objek jenis rujukan yang lemah boleh menjadi sampah yang dikumpulkan di Java jika rujukan tersebut tidak lagi digunakan dalam program.
Mari kita belajar membuat peta hash yang lemah terlebih dahulu. Kemudian, kita akan belajar bagaimana ia berbeza dengan hashmap.
Buat Peta WeakHash
Untuk membuat hashmap yang lemah, kita mesti mengimport java.util.WeakHashMap
pakej terlebih dahulu. Setelah kami mengimport pakej, berikut adalah bagaimana kita dapat membuat hashmap yang lemah di Java.
//WeakHashMap creation with capacity 8 and load factor 0.6 WeakHashMap numbers = new WeakHashMap(8, 0.6);
Dalam kod di atas, kami telah membuat hashmap yang lemah bernama nombor.
Di sini,
- Kunci - pengecam unik yang digunakan untuk mengaitkan setiap elemen (nilai) dalam peta
- Nilai - elemen yang berkaitan dengan kunci dalam peta
Perhatikan bahagiannya new WeakHashMap(8, 0.6)
. Di sini, parameter pertama adalah kapasiti dan parameter kedua adalah loadFactor .
- kapasiti - Kapasiti peta ini adalah 8. Maksudnya, ia dapat menyimpan 8 entri.
- loadFactor - Faktor beban peta ini ialah 0.6. Ini bermaksud setiap kali jadual hash kami diisi sebanyak 60%, entri dipindahkan ke jadual hash baru dua kali ganda dari ukuran jadual hash asal.
Kapasiti lalai dan faktor beban
Adalah mungkin untuk membuat hashmap yang lemah tanpa menentukan kapasiti dan faktor muatannya. Sebagai contoh,
// WeakHashMap with default capacity and load factor WeakHashMap numbers1 = new WeakHashMap();
Secara lalai,
- kapasiti peta akan menjadi 16
- faktor beban akan menjadi 0.75
Perbezaan Antara HashMap dan WeakHashMap
Mari kita lihat pelaksanaan hashmap yang lemah di Java.
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of numbers WeakHashMap numbers = new WeakHashMap(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; // Inserting elements numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("WeakHashMap: " + numbers); // Make the reference null two = null; // Perform garbage collection System.gc(); System.out.println("WeakHashMap after garbage collection: " + numbers); ) )
Pengeluaran
WeakHashMap: (Empat = 4, Dua = 2) WeakHashMap selepas pengumpulan sampah: (Empat)
Seperti yang dapat kita lihat, ketika kunci dua dari hashmap yang lemah diset ke null
dan melakukan pengumpulan sampah, kuncinya dikeluarkan.
Ini kerana tidak seperti hashmaps, kunci hashmaps yang lemah adalah jenis rujukan yang lemah . Ini bermaksud kemasukan peta dikeluarkan oleh pengumpul sampah sekiranya kunci entri tersebut tidak lagi digunakan. Ini berguna untuk menjimatkan sumber.
Sekarang mari kita lihat pelaksanaan yang sama dalam hashmap.
import java.util.HashMap; class Main ( public static void main(String() args) ( // Creating HashMap of even numbers HashMap numbers = new HashMap(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; // Inserting elements numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("HashMap: " + numbers); // Make the reference null two = null; // Perform garbage collection System.gc(); System.out.println("HashMap after garbage collection: " + numbers); ) )
Pengeluaran
HashMap: (Empat = 4, Dua = 2) HashMap selepas pengumpulan sampah: (Empat = 4, Dua = 2)
Di sini, apabila kunci dua hashmap ditetapkan null
dan melakukan pengumpulan sampah, kuncinya tidak dikeluarkan.
Ini kerana tidak seperti kunci hashmaps yang lemah dari hashmaps adalah jenis rujukan yang kuat . Ini bermaksud kemasukan peta tidak dikeluarkan oleh pengumpul sampah walaupun kunci untuk masuk itu tidak lagi digunakan.
Catatan : Semua fungsi hashmap dan hashmap lemah adalah serupa kecuali kunci hashmap yang lemah adalah rujukan yang lemah, sedangkan kunci hashmap adalah rujukan kuat.
Membuat WeakHashMap dari Peta Lain
Inilah cara kita dapat membuat hashmap yang lemah dari peta lain.
import java.util.HashMap; import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating a hashmap of even numbers HashMap evenNumbers = new HashMap(); String two = new String("Two"); Integer twoValue = 2; evenNumbers.put(two, twoValue); System.out.println("HashMap: " + evenNumbers); // Creating a weak hash map from other hashmap WeakHashMap numbers = new WeakHashMap(evenNumbers); System.out.println("WeakHashMap: " + numbers); ) )
Pengeluaran
HashMap: (Two = 2) WeashHashMap: (Two = 2)
Kaedah WeakHashMap
The WeakHashMap
kelas menyediakan kaedah yang membolehkan kita untuk melakukan pelbagai operasi di atas peta.
Masukkan Elemen ke WeakHashMap
put()
- memasukkan pemetaan kunci / nilai yang ditentukan ke petaputAll()
- memasukkan semua entri dari peta yang ditentukan ke peta iniputIfAbsent()
- memasukkan pemetaan kunci / nilai yang ditentukan ke peta jika kunci yang ditentukan tidak terdapat dalam peta
Sebagai contoh,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap evenNumbers = new WeakHashMap(); String two = new String("Two"); Integer twoValue = 2; // Using put() evenNumbers.put(two, twoValue); String four = new String("Four"); Integer fourValue = 4; // Using putIfAbsent() evenNumbers.putIfAbsent(four, fourValue); System.out.println("WeakHashMap of even numbers: " + evenNumbers); //Creating WeakHashMap of numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); // Using putAll() numbers.putAll(evenNumbers); System.out.println("WeakHashMap of numbers: " + numbers); ) )
Pengeluaran
WeakHashMap nombor genap: (Empat = 4, Dua = 2) WeakHashMap nombor: (Dua = 2, Empat = 4, Satu = 1)
Akses Elemen WeakHashMap
1. Using entrySet(), keySet() and values()
entrySet()
- returns a set of all the key/value mapping of the mapkeySet()
- returns a set of all the keys of the mapvalues()
- returns a set of all the values of the map
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using entrySet() System.out.println("Key/Value mappings: " + numbers.entrySet()); // Using keySet() System.out.println("Keys: " + numbers.keySet()); // Using values() System.out.println("Values: " + numbers.values()); ) )
Output
WeakHashMap: (Two=2, One=1) Key/Value mappings: (Two=2, One=1) Keys: (Two, One) Values: (1, 2)
2. Using get() and getOrDefault()
get()
- Returns the value associated with the specified key. Returnsnull
if the key is not found.getOrDefault()
- Returns the value associated with the specified key. Returns the specified default value if the key is not found.
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using get() int value1 = numbers.get("Two"); System.out.println("Using get(): " + value1); // Using getOrDefault() int value2 = numbers.getOrDefault("Four", 4); System.out.println("Using getOrDefault(): " + value2); ) )
Output
WeakHashMap: (Two=2, One=1) Using get(): 2 Using getOrDefault(): 4
Remove WeakHashMap Elements
remove(key)
- returns and removes the entry associated with the specified key from the mapremove(key, value)
- removes the entry from the map only if the specified key mapped to the specified value and return a boolean value
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using remove() with single parameter int value = numbers.remove("Two"); System.out.println("Removed value: " + value); // Using remove() with 2 parameters boolean result = numbers.remove("One", 3); System.out.println("Is the entry (One=3) removed? " + result); System.out.println("Updated WeakHashMap: " + numbers); ) )
Output
WeakHashMap: (Dua = 2, Satu = 1) Nilai yang dikeluarkan: 2 Adakah entri (Satu = 3) dikeluarkan? Peta Lemah Lemah yang Dikemaskini: (Satu = 1)
Kaedah lain dari WeakHashMap
Kaedah | Penerangan |
---|---|
clear() | Membuang semua entri dari peta |
containsKey() | Memeriksa apakah peta mengandungi kunci yang ditentukan dan mengembalikan nilai boolean |
containsValue() | Memeriksa apakah peta mengandungi nilai yang ditentukan dan mengembalikan nilai boolean |
size() | Mengembalikan ukuran peta |
isEmpty() | Memeriksa apakah peta kosong dan mengembalikan nilai boolean |
Untuk mengetahui lebih lanjut, lawati Java WeakHashMap (dokumentasi Java rasmi).