Java WeakHashMap – Memahami, Penggunaan, dan Perbedaan Kunci
Java WeakHashMap
Panduan lengkap tentang WeakHashMap Java, mencakup pembuatannya, perbedaan kunci dari HashMap, contoh praktis, dan metode penting.
Kelas WeakHashMap adalah bagian dari Java Collections Framework dan mengimplementasikan antarmuka Map. Ia berperilaku seperti tabel hash biasa tetapi menyimpan kunci sebagai referensi lemah, yang memungkinkannya untuk direklamasi oleh pengumpul sampah ketika tidak lagi digunakan.
Catatan: Kunci dalam WeakHashMap dibungkus dalam objek WeakReference.
Referensi lemah dapat direklamasi oleh pengumpul sampah jika program tidak lagi memegang referensi kuat ke objek kunci.
Membuat WeakHashMap
Pertama, impor java.util.WeakHashMap:
import java.util.WeakHashMap;
Kemudian buat instance, secara opsional menentukan kapasitas awal dan faktor beban:
// WeakHashMap with a capacity of 8 and a load factor of 0.6 WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);
Parameter:
- kapasitas – jumlah entri yang dapat ditampung map sebelum pengubahan ukuran. Default adalah 16.
- faktorBeban – ambang batas saat map perlu diperluas. Default adalah 0.75.
Ketika tidak ada parameter yang diberikan, nilai default akan berlaku:
WeakHashMap<Key, Value> numbers = new WeakHashMap<>();
HashMap vs. WeakHashMap
Meskipun keduanya mengimplementasikan Map, perbedaan utama terletak pada kekuatan referensi:
- HashMap – kunci adalah referensi kuat; entri bertahan hingga secara eksplisit dihapus.
- WeakHashMap – kunci adalah referensi lemah; entri menghilang ketika kunci tidak lagi dapat dijangkau.
Contoh yang menunjukkan perilaku:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("WeakHashMap: " + numbers); // Nullify the reference to the key two = null; System.gc(); System.out.println("WeakHashMap after GC: " + numbers); } }
Output:
WeakHashMap: {Four=4, Two=2} WeakHashMap after GC: {Four=4} Entri untuk "Two" menghilang karena kunci tidak lagi dapat dijangkau secara kuat. Sebaliknya, HashMap akan mempertahankan entri:
import java.util.HashMap; class Main { public static void main(String[] args) { HashMap<String, Integer> numbers = new HashMap<>(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("HashMap: " + numbers); two = null; System.gc(); System.out.println("HashMap after GC: " + numbers); } }
Output:
HashMap: {Four=4, Two=2} HashMap after GC: {Four=4, Two=2} Jadi, WeakHashMap ideal ketika Anda ingin map secara otomatis melepaskan memori yang terkait dengan kunci yang tidak digunakan.
Mengonversi dari Map Lain
Buat instance WeakHashMap dari map yang ada untuk menyalin entri:
import java.util.HashMap; import java.util.WeakHashMap; class Main { public static void main(String[] args) { HashMap<String, Integer> evenNumbers = new HashMap<>(); String two = new String("Two"); evenNumbers.put(two, 2); System.out.println("HashMap: " + evenNumbers); WeakHashMap<String, Integer> numbers = new WeakHashMap<>(evenNumbers); System.out.println("WeakHashMap: " + numbers); } }
Output:
HashMap: {Two=2} WeakHashMap: {Two=2}
Metode Utama WeakHashMap
Berikut adalah pilihan operasi yang paling sering digunakan.
Menyisipkan Entri
put(key, value) – menambahkan pemetaan. putAll(map) – menggabungkan map lain. putIfAbsent(key, value) – menyisipkan hanya jika kunci tidak ada.
Contoh:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { WeakHashMap<String, Integer> evenNumbers = new WeakHashMap<>(); evenNumbers.put(new String("Two"), 2); evenNumbers.putIfAbsent(new String("Four"), 4); System.out.println("Even numbers: " + evenNumbers); WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); numbers.put(new String("One"), 1); numbers.putAll(evenNumbers); System.out.println("All numbers: " + numbers); } }
Output:
Even numbers: {Four=4, Two=2} All numbers: {Two=2, Four=4, One=1} Mengakses Entri
Ambil data melalui:
get(key) – mengembalikan nilai atau null jika tidak ada. getOrDefault(key, default) – mengembalikan default saat kunci hilang. entrySet(), keySet(), values() – melakukan iterasi atas entri, kunci, atau nilai.
Contoh:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); numbers.put(new String("One"), 1); numbers.put(new String("Two"), 2); System.out.println("Map: " + numbers); System.out.println("Entry set: " + numbers.entrySet()); System.out.println("Keys: " + numbers.keySet()); System.out.println("Values: " + numbers.values()); System.out.println("Get Two: " + numbers.get("Two")); System.out.println("GetOrDefault Four: " + numbers.getOrDefault("Four", 4)); } }
Output:
Map: {Two=2, One=1} Entry set: [Two=2, One=1] Keys: [Two, One] Values: [1, 2] Get Two: 2 GetOrDefault Four: 4 Menghapus Entri
remove(key) – menghapus dan mengembalikan nilai. remove(key, value) – menghapus hanya jika pemetaan saat ini cocok dengan nilai yang diberikan. clear() – mengkosongkan map. containsKey(key), containsValue(value), size(), isEmpty()
Contoh:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); numbers.put(new String("One"), 1); numbers.put(new String("Two"), 2); System.out.println("Map: " + numbers); int removed = numbers.remove("Two"); System.out.println("Removed value: " + removed); boolean removedIf = numbers.remove("One", 3); System.out.println("Removed {One=3}? " + removedIf); System.out.println("After removal: " + numbers); } }
Output:
Map: {Two=2, One=1} Removed value: 2 Removed {One=3}? false After removal: {One=1}
Utilitas Tambahan
| Metode | Deskripsi |
clear() | Menghapus semua entri. |
containsKey(key) | Memeriksa apakah kunci ada. |
containsValue(value) | Memeriksa apakah nilai ada. |
size() | Mengembalikan jumlah entri. |
isEmpty() | Mengembalikan true jika map tidak memiliki entri. |
Untuk mendalami lebih jauh, lihat dokumentasi WeakHashMap Java resmi.