English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы будем изучать Java WeakHashMap и его операции с помощью примеров. Мы также узнаем о различиях между WeakHashMap и HashMap
Класс WeakHashMap, предоставляемый Java Collection Framework, предоставляет функции структуры данных хеш-таблицы.
Он реализуетИнтерфейс Map.
Внимание: слабые ключи hashmap belong toWeakReferenceТип.
Объекты типа слабой ссылки могут быть собраны мусором в Java, если ссылка больше не используется в программе.
Давайте сначала изучим, как создать слабую хеш-карту. Затем мы рассмотрим отличия от HashMap.
Чтобы создать слабую хеш-таблицу,我们必须 сначала импортировать пакет java.util.WeakHashMap. После импорта пакета можно использовать следующий метод для создания слабой хеш-таблицы в Java.
// Создание WeakHashMap с объемом 8 и коэффициентом загрузки 0.6 WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);
В приведенном выше коде мы создали WeakHashMap под названием numbers.
Здесь,
Key - уникальный идентификатор, используемый для связи каждого элемента (значения) в карте
Value - элемент, связанный с ключом в карте
Обратите внимание на часть new WeakHashMap<>(8, 0.6). Здесь, первый параметр - это объем, а второй параметр - это коэффициент загрузки.
capacity - Объем этой карты составляет 8. Это означает, что она может хранить 8 элементов.
loadFactor- Параметр загрузки этой карты равен 0.6. Это означает, что как только наш хеш-таблица заполнится на 60%, элементы будут перемещены в новую хеш-таблицу, размер которой в два раза больше, чем у исходной.
Defaultный объем и коэффициент загрузки
WeakHashMap можно создавать без определения объема и коэффициента загрузки. Например,
// WeakHashMap с defaultными объемом и коэффициентом загрузки WeakHashMap<Key, Value> numbers1 = new WeakHashMap<>();
По умолчанию
Объем карты будет равен 16
Параметр загрузки составит 0.75
Позвольте нам看一下Java-реализации слабых хеш-таблиц.
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // 创建名称为numbers的WeakHashMap 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); //null引用 two = null; // Выполнение garbage collection System.gc(); System.out.println("Weak垃圾回收后的HashMap: " + numbers); } }
Результат вывода
WeakHashMap: {Four=4, Two=2} Weak垃圾回收后的HashMap: {Four}
Как мы видим, когда ключ 'two' слабого хэш-словаря установлен в null и выполнен garbage collection, ключ будет удален.
Это потому, что, в отличие от хэш-таблицы, ключи слабой хэш-таблицы belong toСлабая ссылкаТип. Это означает, что если элемент карты больше не используется, мусоросборщик удалит этот элемент. Это полезно для экономии ресурсов.
Теперь давайте посмотрим на аналогичное реализация в хеше.
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); // Установить ссылку в null two = null; // Выполнение garbage collection System.gc(); System.out.println("HashMap после garbage collection: " + numbers); } }
Результат вывода
HashMap: {Four=4, Two=2} HashMap после garbage collection: {Four=4, Two=2}
Здесь, если ключ хэш-таблицы 'two' будет установлен в null и выполнен мусоросборщик, ключ не将被 удален.
Это потому, что, в отличие от слабого hashmap, ключи hashmap имеютСильная ссылкаТип. Это означает, что даже если ключ элемента карты больше не используется, этот элемент не будет удален мусоросборщиком.
ВниманиеВсе функции hashmap и слабого hashmap схожи, кроме того, что ключи слабого hashmap являются слабыми ссылками, а ключи hashmap являются сильными ссылками.
Это метод, который позволяет нам создавать слабый хэш-таблицу из другого мапа.
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"); Integer twoValue = 2; evenNumbers.put(two, twoValue); System.out.println("HashMap: " + evenNumbers); // Создание слабого хэш-словаря из другого хэш-словаря WeakHashMap<String, Integer> numbers = new WeakHashMap<>(evenNumbers); System.out.println("WeakHashMap: " + numbers); } }
Результат вывода
HashMap: {Two=2} WeakHashMap: {Two=2}
Класс WeakHashMap предоставляет методы, которые позволяют нам выполнять различные операции над словарем.
put() - Вставляет указанное значение/ключ в мапу
putAll() - Вставляет все элементы из указанной мапы в эту мапу
putIfAbsent() - Если в мапе нет указанного ключа, вставляет указанное значение/ключ в мапу
Например:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // Создать WeakHashMap для пар четных чисел WeakHashMap<String, Integer> evenNumbers = new WeakHashMap<>(); String two = new String("Two"); Integer twoValue = 2; // Использование put() evenNumbers.put(two, twoValue); String four = new String("Four"); Integer fourValue = 4; // Использование putIfAbsent() evenNumbers.putIfAbsent(four, fourValue); System.out.println("WeakHashMap с четными числами: " + evenNumbers); // Создание WeakHashMap с именем numbers WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); // Использование putAll() numbers.putAll(evenNumbers); System.out.println("Числа WeakHashMap: " + numbers); } }
Результат вывода
WeakHashMap с четными числами: {Four=4, Two=2} Числа WeakHashMap: {Two=2, Four=4, One=1}
1. Использование entrySet(), keySet() и values()
entrySet() - Возвращает набор всех значений/ключей мапы
keySet() - Возвращает набор всех ключей мапы
values() - Возвращает набор всех значений мапы
Например:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // Создать WeakHashMap для пар четных чисел WeakHashMap<String, Integer> 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); // Использование entrySet() System.out.println("Мапа значений/ключей: " + numbers.entrySet()); // Использование keySet() System.out.println("Ключи: " + numbers.keySet()); // Использование values() System.out.println("Значения: " + numbers.values()); } }
Результат вывода
WeakHashMap: {Two=2, One=1} Мапа значений/ключей: [Two=2, One=1] Ключи: [Two, One] Значения: [1, 2]
2. Использование get() и getOrDefault()
get() - Возвращает значение, связанное с указанным ключом. Если ключ не найден, возвращает null.
getOrDefault() - Возвращает значение, связанное с указанным ключом. Если ключ не найден, возвращает указанное значение по умолчанию.
Например:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // Создать WeakHashMap для пар четных чисел WeakHashMap<String, Integer> 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); // Использование get() int value1 = numbers.get("Two"); System.out.println("Использование метода get(): " + value1); // Использование getOrDefault() int value2 = numbers.getOrDefault("Four", 4); System.out.println("Использование метода getOrDefault(): " + value2); } }
Результат вывода
WeakHashMap: {Two=2, One=1} Использование метода get(): 2 Использование метода getOrDefault(): 4
remove(key) - Возвращает и удаляет элемент из карты, связанный с указанным ключом.
remove(key, value) - Удаляет запись из карты только если указанный ключ ассоциирован с указанным значением и возвращает булево значение
Например:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // Создать WeakHashMap для пар четных чисел WeakHashMap<String, Integer> 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); // Использовать remove() с одним параметром int value = numbers.remove("Two"); System.out.println("Удалить значение: " + value); // Использование remove() с двумя параметрами boolean result = numbers.remove("One", 3); System.out.println("Элемент {One=3} был удален? " + result); System.out.println("Обновленный WeakHashMap: " + numbers); } }
Результат вывода
WeakHashMap: {Two=2, One=1} Удалить значение: 2 Элемент {One=3} был удален? False Обновленный WeakHashMap: {One=1}
Метод | Описание |
---|---|
clear() | Удалить все элементы из map |
containsKey() | Проверить, содержит ли map заданный ключ, и вернуть булево значение |
containsValue() | Проверить, содержит ли map заданное значение, и вернуть булево значение |
size() | Вернуть размер map |
isEmpty() | Проверить, пуст ли map, и вернуть булево значение |