Java WeakHashMap

У цьому підручнику ми дізнаємося про Java WeakHashMap та її операції за допомогою прикладів. Ми також дізнаємося про відмінності між WeakHashMap та HashMap

WeakHashMapКлас рамках колекції Java забезпечує особливість структури даних хеш - таблиці …

Він реалізує інтерфейс Map.

Примітка : Клавіші слабкої хеш-карти мають тип WeakReference .

Об'єктом слабкого посилального типу може бути сміття, зібране на Java, якщо посилання більше не використовується в програмі.

Навчимося спочатку створювати слабку хеш-карту. Потім ми дізнаємось, чим він відрізняється від хеш-карти.

Створіть WeakHashMap

Для того, щоб створити слабку хеш-карту, спочатку потрібно імпортувати java.util.WeakHashMapпакет. Як тільки ми імпортуємо пакет, ось як ми можемо створити слабкі хеш-карти в Java.

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

У наведеному вище коді ми створили слабку хеш-карту з іменами чисел.

Ось,

  • Ключ - унікальний ідентифікатор, який використовується для асоціювання кожного елемента (значення) на карті
  • Значення - елементи, пов'язані ключами на карті

Зверніть увагу на частину new WeakHashMap(8, 0.6). Тут першим параметром є ємність, а другим параметром loadFactor .

  • ємність - Місткість цієї карти дорівнює 8. Значення, вона може зберігати 8 записів.
  • loadFactor - коефіцієнт навантаження на цій карті становить 0,6. Це означає, що всякий раз, коли наша хеш-таблиця заповнюється на 60%, записи переміщуються до нової хеш-таблиці подвійного розміру вихідної хеш-таблиці.

Потужність та коефіцієнт навантаження за замовчуванням

Можна створити слабку хеш-карту, не визначаючи її потужності та коефіцієнта навантаження. Наприклад,

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

За замовчуванням,

  • ємність карти складе 16
  • коефіцієнт навантаження складе 0,75

Відмінності між HashMap та WeakHashMap

Побачимо реалізацію слабкої хеш-карти в 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); ) ) 

Вихідні дані

 WeakHashMap: (Чотири = 4, Два = 2) WeakHashMap після збору сміття: (Чотири) 

Як бачимо, коли для двох ключових елементів слабкої хеш-карти встановлено значення nullі виконується збір сміття, ключ видаляється.

Це тому, що на відміну від хеш-карт, ключі слабких хеш-карт мають слабкий контрольний тип. Це означає, що запис карти видаляється збирачем сміття, якщо ключ до цього запису більше не використовується. Це корисно для економії ресурсів.

Тепер давайте побачимо ту ж реалізацію в хеш-капі.

 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); ) ) 

Вихідні дані

 HashMap: (чотири = 4, два = 2) HashMap після збору сміття: (чотири = 4, два = 2) 

Тут, коли для двох ключів хеш-карти встановлено значення nullта виконується збір сміття, ключ не видаляється.

Це тому, що на відміну від слабких хеш-карт ключі хеш-карт мають сильний контрольний тип. Це означає, що запис карти не видаляється збирачем сміття, навіть якщо ключ до цього запису більше не використовується.

Примітка : Усі функціональні можливості хеш-карт та слабких хеш-карт подібні, за винятком того, що ключі слабкої хеш-карти мають слабке посилання, тоді як ключі хеш-карти мають сильне посилання.

Створення WeakHashMap з інших карт

Ось як ми можемо створити слабку хеш-карту з інших карт.

 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); ) ) 

Вихідні дані

 HashMap: (Два = 2) WeakHashMap: (Два = 2) 

Методи WeakHashMap

WeakHashMapКлас надає методи, що дозволяють виконувати різні операції по карті.

Вставити елементи в WeakHashMap

  • put() - вставляє вказане відображення ключа / значення на карту
  • putAll() - вставляє всі записи із зазначеної карти на цю карту
  • putIfAbsent() - вставляє вказане відображення ключа / значення на карту, якщо вказаний ключ відсутній на карті

Наприклад,

 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); ) ) 

Вихідні дані

 WeakHashMap парних чисел: (Чотири = 4, Два = 2) WeakHashMap чисел: (Два = 2, Чотири = 4, Один = 1) 

Доступ до елементів 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: (Два = 2, Один = 1) Видалене значення: 2 Чи видалено запис (Один = 3)? Помилково оновлене WeakHashMap: (One = 1)

Інші методи WeakHashMap

Метод Опис
clear() Видаляє всі записи з карти
containsKey() Перевіряє, чи карта містить вказаний ключ і повертає логічне значення
containsValue() Перевіряє, чи містить карта вказане значення та повертає логічне значення
size() Повертає розмір карти
isEmpty() Перевіряє, чи карта порожня, і повертає логічне значення

Щоб дізнатися більше, відвідайте Java WeakHashMap (офіційна документація Java).

Цікаві статті...