English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы будем изучать Java LinkedHashMap класс и его операции с помощью примеров.
Класс LinkedHashMap в Java Collection Framework предоставляетИнтерфейс Mapреализации хэш-таблицы и связной списка.
LinkedHashMap наследуетHashMapкласс, чтобы хранить его элементы в хэш-таблице. Внутри он поддерживает двустороннюю связную список между всеми элементами для сортировки элементов.
Чтобы создать двустороннюю связную список,我们必须 сначала импортировать пакет 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, то элементы в двунаправленном списке будут сортироваться по порядку последнего доступа
Ниже приведен пример создания двунаправленного списка, содержащего все элементы другой карты
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 предоставляет нам возможность выполнять различные операции над картой
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}
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
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}
Метод | Описание |
---|---|
clear() | Удаление всех записей из map |
containsKey() | Проверка, содержит ли map заданный ключ, и возвращение булевского значения |
containsValue() | Проверка, содержит ли map заданное значение, и возвращение булевского значения |
size() | Возврат размера map |
isEmpty() | Проверка, пуст ли map, и возвращение булевского значения |
LinkedHashMap и HashMap оба реализуют интерфейс Map. Однако, между ними существуют некоторые различия.
LinkedHashMap внутренне поддерживает двусторонний список. Таким образом, он сохраняет порядок вставки своих элементов.
Класс LinkedHashMap требует больше места для хранения, чем HashMap. Это связано с тем, что LinkedHashMap внутренне поддерживает список.
Производительность LinkedHashMap медленнее, чем HashMap.