В этом руководстве мы узнаем о Java WeakHashMap и ее операциях с помощью примеров. Мы также узнаем о различиях между WeakHashMap и HashMap.
WeakHashMap
Класс рамках коллекции Java обеспечивает особенность структуры данных хеш - таблицы …
Он реализует интерфейс карты.
Примечание . Ключи слабой хэш-карты относятся к типу WeakReference .
Объект слабого ссылочного типа может быть обработан сборщиком мусора в Java, если ссылка больше не используется в программе.
Давайте сначала научимся создавать слабую хеш-карту. Затем мы узнаем, чем он отличается от хэш-карты.
Создать WeakHashMap
Чтобы создать слабую хэш-карту, мы должны java.util.WeakHashMap
сначала импортировать пакет. После импорта пакета вот как мы можем создавать слабые хэш-карты в Java.
//WeakHashMap creation with capacity 8 and load factor 0.6 WeakHashMap numbers = new WeakHashMap(8, 0.6);
В приведенном выше коде мы создали слабую хэш-карту с именем numbers.
Вот,
- Ключ - уникальный идентификатор, используемый для связи каждого элемента (значения) на карте.
- Значение - элементы, связанные ключами на карте
Обратите внимание на деталь 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 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: (Два = 2, Один = 1) Удаленное значение: 2 Удалена ли запись (Один = 3)? Ложно обновленное WeakHashMap: (One = 1)
Другие методы WeakHashMap
Метод | Описание |
---|---|
clear() | Удаляет все записи с карты |
containsKey() | Проверяет, содержит ли карта указанный ключ и возвращает логическое значение |
containsValue() | Проверяет, содержит ли карта указанное значение и возвращает логическое значение |
size() | Возвращает размер карты. |
isEmpty() | Проверяет, пуста ли карта, и возвращает логическое значение |
Чтобы узнать больше, посетите Java WeakHashMap (официальная документация по Java).