English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Управление потоком

Java Массивы

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java Список (List)

Java Queue (очередь)

Java Map-сборники

Java Set-сборники

Java Вход/выход (I/O)

Java Reader/Writer

Другие темы Java

Java WeakHashMap

В этом руководстве мы будем изучать Java WeakHashMap и его операции с помощью примеров. Мы также узнаем о различиях между WeakHashMap и HashMap

Класс WeakHashMap, предоставляемый Java Collection Framework, предоставляет функции структуры данных хеш-таблицы.

Он реализуетИнтерфейс Map.

Внимание: слабые ключи hashmap belong toWeakReferenceТип.

Объекты типа слабой ссылки могут быть собраны мусором в Java, если ссылка больше не используется в программе.

Давайте сначала изучим, как создать слабую хеш-карту. Затем мы рассмотрим отличия от HashMap.

Создание WeakHashMap

Чтобы создать слабую хеш-таблицу,我们必须 сначала импортировать пакет 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

Разница между HashMap и WeakHashMap

Позвольте нам看一下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 являются сильными ссылками.

Создание WeakHashMap из другого мапа

Это метод, который позволяет нам создавать слабый хэш-таблицу из другого мапа.

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

Класс WeakHashMap предоставляет методы, которые позволяют нам выполнять различные операции над словарем.

Вставка элементов в 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}

Доступ к элементам WeakHashMap

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

Удаление элементов из WeakHashMap

  • 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}

Другие методы WeakHashMap

МетодОписание
clear()Удалить все элементы из map
containsKey()Проверить, содержит ли map заданный ключ, и вернуть булево значение
containsValue()Проверить, содержит ли map заданное значение, и вернуть булево значение
size()Вернуть размер map
isEmpty()Проверить, пуст ли map, и вернуть булево значение