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

LinkedHashMap Java

В этом руководстве мы будем изучать Java LinkedHashMap класс и его операции с помощью примеров.

Класс LinkedHashMap в Java Collection Framework предоставляетИнтерфейс Mapреализации хэш-таблицы и связной списка.

LinkedHashMap наследуетHashMapкласс, чтобы хранить его элементы в хэш-таблице. Внутри он поддерживает двустороннюю связную список между всеми элементами для сортировки элементов.

Создайте LinkedHashMap

Чтобы создать двустороннюю связную список,我们必须 сначала импортировать пакет java.util.LinkedHashMap. После импорта пакета можно использовать следующий метод для создания двусторонней связной списка в Java.

//Инициальная емкость LinkedHashMap составляет 8, коэффициент загрузки равен 0.6
LinkedHashMap<Key, Value> numbers = new LinkedHashMap<>(8, 0.6f);

В приведенном выше коде мы создали LinkedHashMap под названием numbers.

Здесь,

  • Key - уникальный идентификатор, используемый для связи каждого элемента (значения) в карте

  • Value - элемент, связанный с ключом в карте

Обратите внимание на часть new LinkedHashMap<>(8, 0.6). Здесь, первый параметр - это емкость, а второй параметр - коэффициент загрузки.

  • capacity - Емкость этой двусторонней связной списка составляет 8. Это означает, что она может хранить 8 элементов.

  • loadFactor- Коэффициент загрузки этой двусторонней связной списка равен 0.6. Это означает, что каждый раз, когда хэш-мапа заполняется на 60%, элементы перемещаются в новый хэш-таблицу, размер которой в два раза больше, чем у исходной хэш-таблицы.

по умолчанию емкость и коэффициент загрузки

Не нужно определять его емкость и коэффициент загрузки, чтобы создать двустороннюю связную список. Например,

//具有限定容量和负载因子的LinkedHashMap
LinkedHashMap<Key, Value> numbers1 = new LinkedHashMap<>();

По умолчанию,

  • Капаситет двунаправленного списка будет равен 16

  • Плотность загрузки будет равна 0.75

Обратите вниманиеLinkedHashMap类 также позволяет нам определить порядок элементов. Например

// LinkedHashMap с указанным порядком
LinkedHashMap<Key, Value> numbers2 = new LinkedHashMap<>(capacity, loadFactor, accessOrder);

Здесь accessOrder - это булево значение. По умолчанию оно равно false. В этом случае элементы в двунаправленном списке будут сортироваться по порядку их вставки

Но если значение accessOrder равно true, то элементы в двунаправленном списке будут сортироваться по порядку последнего доступа

// Создание LinkedHashMap из другого двунаправленного списка

Ниже приведен пример создания двунаправленного списка, содержащего все элементы другой карты

import java.util.LinkedHashMap;
class Main {
    public static void main(String[] args) {
        // Создание LinkedHashMap с четными числами
        LinkedHashMap<String, Integer> evenNumbers = new LinkedHashMap<>();
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);
        System.out.println("LinkedHashMap1: " + evenNumbers);
        // Создание LinkedHashMap из другого LinkedHashMap
        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>(evenNumbers);
        numbers.put("Three", 3);
        System.out.println("LinkedHashMap2: " + numbers);
    }
}

Результат вывода

LinkedHashMap1: {Two=2, Four=4}
LinkedHashMap2: {Two=2, Four=4, Three=3}

Методы LinkedHashMap

Этот класс LinkedHashMap предоставляет нам возможность выполнять различные операции над картой

Вставка элементов в LinkedHashMap

  • put() - вставляет указанное значение ключ/значение в карту

  • putAll() - вставляет все элементы из указанной карты в эту карту

  • putIfAbsent() - если в карте нет указанного ключа, то вставляет указанное значение ключ/значение в карту

Например:

import java.util.LinkedHashMap;
class Main {
    public static void main(String[] args) {
        // Создание LinkedHashMap с четными числами
        LinkedHashMap<String, Integer> evenNumbers = new LinkedHashMap<>();
        // Использование put()
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);
        System.out.println("Оригинальный LinkedHashMap: " + evenNumbers);
        // Использование putIfAbsent()
        evenNumbers.putIfAbsent("Six", 6);
        System.out.println("Обновленный LinkedHashMap(): " + evenNumbers);
        // Создание LinkedHashMap numbers
        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
        numbers.put("One", 1);
        // Использование putAll()
        numbers.putAll(evenNumbers);
        System.out.println("Новый LinkedHashMap: " + numbers);
    }
}

Результат вывода

Оригинальный LinkedHashMap: {Two=2, Four=4}
Обновленный LinkedHashMap: {Two=2, Four=4, Six=6}
Новый LinkedHashMap: {One=1, Two=2, Four=4, Six=6}

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

1. Использование entrySet(), keySet() и values()

  • entrySet() - возвращает набор всех ключ/значение соответствий карты

  • keySet() - возвращает набор всех ключей карты

  • values() - возвращает набор всех значений карты

Например:

import java.util.LinkedHashMap;
class Main {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("LinkedHashMap: " + numbers);
        // Использование entrySet()
        System.out.println("Карта ключ/значение: " + numbers.entrySet());
        // Использование keySet()
        System.out.println("Ключи (Keys): " + numbers.keySet());
        // Использование values()
        System.out.println("Значения (Values): " + numbers.values());
    }
}

Результат вывода

LinkedHashMap: {One=1, Two=2, Three=3}
Карта ключ/значение: [One=1, Two=2, Three=3]
Ключи (Keys): [One, Two, Three]
Значения (Values): [1, 2, 3]

2. Использование get() и getOrDefault()

  • get() - Возвращает значение, связанное с ключом. Если ключ не найден, возвращает null.

  • getOrDefault() - Возвращает значение, связанное с ключом. Если ключ не найден, возвращает указанное значение по умолчанию.

Например:

import java.util.LinkedHashMap;
class Main {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("LinkedHashMap: " + numbers);
        //Использование get()
        int value1 = numbers.get("Three");
        System.out.println("Возврат числа: " + value1);
        //Использование getOrDefault()
        int value2 = numbers.getOrDefault("Five", 5);
        System.out.println("Возврат числа: " + value2);
    }
}

Результат вывода

LinkedHashMap: {One=1, Two=2, Three=3}
Возврат числа: 3
Возврат числа: 5

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

  • remove(key) - Возвращает и удаляет элемент из мапы, связанный с ключом key.

  • remove(key, value) - Удаляет запись из мапы только если ключ key соответствует значению value и возвращает булево значение.

Например:

import java.util.LinkedHashMap;
class Main {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("LinkedHashMap: " + numbers);
        //Метод удаления с одним параметром
        int value = numbers.remove("Two");
        System.out.println("Удаленный значений: " + value);
        //Метод удаления с двумя параметрами
        boolean result = numbers.remove("Three", 3);
        System.out.println("Удален ли элемент с ключом 'Three'? " + result);
        System.out.println("Обновленный LinkedHashMap: " + numbers);
    }
}

Результат вывода

LinkedHashMap: {One=1, Two=2, Three=3}
Удалить значение: 2
Удален ли элемент 3? True
Обновленный LinkedHashMap: {One=1}

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

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

Различия между LinkedHashMap и HashMap

LinkedHashMap и HashMap оба реализуют интерфейс Map. Однако, между ними существуют некоторые различия.

  • LinkedHashMap внутренне поддерживает двусторонний список. Таким образом, он сохраняет порядок вставки своих элементов.

  • Класс LinkedHashMap требует больше места для хранения, чем HashMap. Это связано с тем, что LinkedHashMap внутренне поддерживает список.

  • Производительность LinkedHashMap медленнее, чем HashMap.