V tomto výučbe sa pomocou príkladov dozvieme o prostredí Java WeakHashMap a jeho operáciách. Dozvieme sa tiež o rozdieloch medzi WeakHashMap a HashMap
WeakHashMap
Trieda zbierok rámca Java poskytuje funkcie dátovej štruktúry hash tabuľky …
Implementuje rozhranie Mapy.
Poznámka : Klávesy slabej hashmapy sú typu WeakReference .
Objekt slabého typu referencie môže byť odpadky zhromažďované v Jave, ak sa referencia v programe už nepoužíva.
Naučme sa najskôr vytvoriť slabú hashovaciu mapu. Potom sa dozvieme, ako sa líši od hashmapy.
Vytvorte mapu WeakHashMap
Aby sme vytvorili slabú hashmapu, musíme najskôr importovať java.util.WeakHashMap
balík. Po importovaní balíka tu môžeme vytvoriť slabé hashmapy v Jave.
//WeakHashMap creation with capacity 8 and load factor 0.6 WeakHashMap numbers = new WeakHashMap(8, 0.6);
Vo vyššie uvedenom kóde sme vytvorili slabú hashmapu pomenovanú čísla.
Tu,
- Kľúč - jedinečný identifikátor, ktorý sa používa na priradenie každého prvku (hodnoty) k mape
- Hodnota - prvky spojené s klávesmi na mape
Všimnite si časť new WeakHashMap(8, 0.6)
. Tu je prvým parametrom kapacita a druhým parametrom je loadFactor .
- kapacita - kapacita tejto mapy je 8. To znamená, že do nej možno uložiť 8 záznamov.
- loadFactor - Faktor zaťaženia tejto mapy je 0,6. To znamená, že kedykoľvek je naša hash tabuľka naplnená o 60%, položky sú presunuté do novej hash tabuľky s dvojnásobnou veľkosťou ako pôvodná hash tabuľka.
Predvolená kapacita a faktor zaťaženia
Je možné vytvoriť slabú hashmapu bez definovania jej kapacity a koeficientu zaťaženia. Napríklad,
// WeakHashMap with default capacity and load factor WeakHashMap numbers1 = new WeakHashMap();
Predvolene,
- kapacita mapy bude 16
- činiteľ zaťaženia bude 0,75
Rozdiely medzi HashMap a WeakHashMap
Uvidíme implementáciu slabej hashmapy v Jave.
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); ) )
Výkon
WeakHashMap: (štyri = 4, dve = 2) WeakHashMap po zbere odpadu: (štyri)
Ako vidíme, keď je kľúč dva slabej hashmapy nastavený na null
a vykonáva odvoz odpadu, kľúč je odstránený.
Je to preto, že na rozdiel od hashmaps sú kľúče slabých hashmap slabého referenčného typu. To znamená, že záznam mapy odstráni garbage collector, ak sa kľúč k tomuto záznamu už nebude používať. To je užitočné na šetrenie zdrojov.
Teraz sa pozrime na rovnakú implementáciu v hashmape.
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); ) )
Výkon
HashMap: (štyri = 4, dva = 2) HashMap po zbere odpadu: (štyri = 4, dva = 2)
Tu, keď je kľúč dva z hashmap nastavený na null
a vykonáva odvoz odpadu, kľúč sa neodstráni.
Je to preto, že na rozdiel od slabých hashmaps majú kľúče hashmaps silný referenčný typ. To znamená, že program na odstraňovanie odpadu neodstráni záznam mapy, aj keď sa kľúč k tomuto záznamu už nepoužíva.
Poznámka : Všetky funkčnosti hashmap a slabých hashmap sú podobné, až na to, že kľúče slabého hashmapu majú slabú referenciu, zatiaľ čo kľúče hashmap sú silnej referencie.
Vytváranie WeakHashMap z iných máp
Týmto spôsobom môžeme vytvoriť slabú hashmapu z iných máp.
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); ) )
Výkon
HashMap: (dva = 2) WeakHashMap: (dva = 2)
Metódy WeakHashMap
WeakHashMap
Trieda poskytuje metódy, ktoré nám umožnia vykonávať rôzne operácie na mape.
Vložte prvky do WeakHashMap
put()
- vloží zadané mapovanie kľúča / hodnoty do mapyputAll()
- vloží všetky záznamy z určenej mapy na túto mapuputIfAbsent()
- vloží zadané mapovanie kľúča / hodnoty do mapy, ak sa uvedený kľúč na mape nenachádza
Napríklad,
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); ) )
Výkon
WeakHashMap párnych čísel: (štyri = 4, dva = 2) WeakHashMap čísel: (dva = 2, štyri = 4, jeden = 1)
Prístup k prvkom 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: (dva = 2, jeden = 1) Odstránená hodnota: 2 Je položka (jeden = 3) odstránená? Falošne aktualizovaná mapa WeakHashMap: (jedna = 1)
Ďalšie metódy WeakHashMap
Metóda | Popis |
---|---|
clear() | Odstráni všetky záznamy z mapy |
containsKey() | Skontroluje, či mapa obsahuje zadaný kľúč, a vráti boolovskú hodnotu |
containsValue() | Skontroluje, či mapa obsahuje zadanú hodnotu, a vráti boolovskú hodnotu |
size() | Vráti veľkosť mapy |
isEmpty() | Skontroluje, či je mapa prázdna, a vráti boolovskú hodnotu |
Ak sa chcete dozvedieť viac, navštívte stránku Java WeakHashMap (oficiálna dokumentácia Java).