Java WeakHashMap

V tomto tutoriálu se pomocí příkladů dozvíme o prostředí Java WeakHashMap a jeho operacích. Dozvíme se také o rozdílech mezi WeakHashMap a HashMap

WeakHashMapTřída sbírek rámce Java poskytuje funkce datové struktury hash tabulky …

Implementuje rozhraní Map.

Poznámka : Klíče slabé hashmapy jsou typu WeakReference .

Objekt slabého typu odkazu může být uvolněn v Javě, pokud se odkaz v programu již nepoužívá.

Naučme se nejprve vytvořit slabou hashovací mapu. Poté zjistíme, jak se liší od hashmapy.

Vytvořte WeakHashMap

Abychom vytvořili slabý hashmap, musíme java.util.WeakHashMapnejprve importovat balíček. Jakmile balíček naimportujeme, můžeme v Java vytvořit slabé hashmapy.

 //WeakHashMap creation with capacity 8 and load factor 0.6 WeakHashMap numbers = new WeakHashMap(8, 0.6); 

Ve výše uvedeném kódu jsme vytvořili slabý hashmap pojmenovaná čísla.

Tady,

  • Klíč - jedinečný identifikátor používaný k přidružení každého prvku (hodnoty) na mapě
  • Hodnota - prvky spojené s klíči na mapě

Všimněte si části new WeakHashMap(8, 0.6). Zde je prvním parametrem kapacita a druhým parametrem je loadFactor .

  • kapacita - kapacita této mapy je 8. To znamená, že může uložit 8 záznamů.
  • loadFactor - Faktor zatížení této mapy je 0,6. To znamená, že kdykoli je naše hash tabulka naplněna o 60%, položky jsou přesunuty do nové hash tabulky s dvojnásobnou velikostí původní hash tabulky.

Výchozí kapacita a faktor zatížení

Je možné vytvořit slabý hashmap bez definování jeho kapacity a faktoru zatížení. Například,

 // WeakHashMap with default capacity and load factor WeakHashMap numbers1 = new WeakHashMap(); 

Ve výchozím stavu,

  • kapacita mapy bude 16
  • činitel zatížení bude 0,75

Rozdíly mezi HashMap a WeakHashMap

Uvidíme implementaci slabé hashmapy v Javě.

 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ýstup

 WeakHashMap: (Čtyři = 4, Dva = 2) WeakHashMap po odvozu odpadu: (Čtyři) 

Jak vidíme, když je klíč dva slabé hashmapy nastaven na nulla provádět odvoz odpadu, klíč je odstraněn.

Je to proto, že na rozdíl od hashmaps jsou klíče slabých hashmaps slabého referenčního typu. To znamená, že položka mapy je odstraněna sběratelem odpadků, pokud klíč k této položce již není používán. To je užitečné pro úsporu zdrojů.

Nyní uvidíme stejnou implementaci v 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); ) ) 

Výstup

 HashMap: (Čtyři = 4, Dva = 2) HashMap po odvozu odpadu: (Čtyři = 4, Dva = 2) 

Tady, když je klíč dva hashmap nastaven na nulla provádět sběr odpadků, klíč se neodstraní.

Je to proto, že na rozdíl od slabých hashmaps jsou klíče hashmaps silného referenčního typu. To znamená, že položka mapy není odstraněna sběratelem odpadků, přestože klíč k této položce se již nepoužívá.

Poznámka : Všechny funkce hashmap a slabých hashmap jsou podobné, kromě toho, že klíče slabé hashmapy mají slabou referenci, zatímco klíče hashmapy mají silnou referenci.

Vytváření WeakHashMap z jiných map

Zde je způsob, jak můžeme vytvořit slabý hashmap z jiných map.

 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ýstup

 HashMap: (dva = 2) WeakHashMap: (dva = 2) 

Metody WeakHashMap

WeakHashMapTřída poskytuje metody, které nám umožní provádět různé operace na mapě.

Vložit prvky do WeakHashMap

  • put() - vloží zadané mapování klíče / hodnoty do mapy
  • putAll() - vloží všechny položky ze zadané mapy na tuto mapu
  • putIfAbsent() - vloží mapování určeného klíče / hodnoty do mapy, pokud zadaný klíč na mapě není

Napří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ýstup

 WeakHashMap sudých čísel: (Čtyři = 4, Dva = 2) WeakHashMap čísel: (Dva = 2, Čtyři = 4, Jeden = 1) 

Přístup k prvkům WeakHashMap

1. Using entrySet(), keySet() and values()

  • entrySet() - returns a set of all the key/value mapping of the map
  • keySet() - returns a set of all the keys of the map
  • values() - 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. Returns null 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 map
  • remove(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: (Two = 2, One = 1) Odstraněná hodnota: 2 Je položka (One = 3) odstraněna? Falešně aktualizovaná mapa WeakHashMap: (jedna = 1)

Další metody WeakHashMap

Metoda Popis
clear() Odebere všechny položky z mapy
containsKey() Zkontroluje, zda mapa obsahuje zadaný klíč a vrátí logickou hodnotu
containsValue() Zkontroluje, zda mapa obsahuje zadanou hodnotu a vrátí logickou hodnotu
size() Vrátí velikost mapy
isEmpty() Zkontroluje, zda je mapa prázdná, a vrátí logickou hodnotu

Další informace najdete na webu Java WeakHashMap (oficiální dokumentace Java).

Zajímavé články...