Освоение Java HashMap: операции, примеры и лучшие практики
Освоение Java HashMap
Изучите класс Java HashMap — его основные возможности, частые операции и практические примеры — чтобы уверенно использовать его в реальных приложениях.
Класс HashMap, часть Java Collections Framework, реализует хеш-таблицу, хранящую данные в парах ключ/значение. Каждый ключ уникален и служит идентификатором для связанного значения. Класс реализует интерфейс Map, предоставляя универсальный API для манипуляции данными.
Создание HashMap
Начните с импорта пакета java.util.HashMap:
import java.util.HashMap;
Затем создайте экземпляр карты. Можно указать обобщённые типы ключа K и значения V, или полагаться на вывод типов:
HashMap<K, V> numbers = new HashMap<>();
Пример с конкретными типами:
HashMap<String, Integer> numbers = new HashMap<>();
Пример 1: Базовое создание HashMap
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> languages = new HashMap<>();
languages.put("Java", 8);
languages.put("JavaScript", 1);
languages.put("Python", 3);
System.out.println("HashMap: " + languages);
}
}
Вывод
HashMap: {Java=8, JavaScript=1, Python=3}
Основные операции с HashMap
Класс HashMap предлагает богатый набор методов. Ниже рассмотрены наиболее часто используемые:
- Добавление элементов
- Доступ к элементам
- Обновление элементов
- Удаление элементов
1. Добавление элементов
Используйте put() для вставки пары ключ/значение. Если ключ уже существует, значение заменяется.
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<String, Integer> numbers = new HashMap<>();
System.out.println("Initial HashMap: " + numbers);
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("HashMap after put(): " + numbers);
}
}
Вывод
Initial HashMap: {} HashMap after put(): {One=1, Two=2, Three=3}
Ключ: String, Значение: Integer в этом примере.
2. Доступ к элементам
Получите значение с помощью get(key). Метод возвращает null, если ключ отсутствует.
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
String value = languages.get(1);
System.out.println("Value at key 1: " + value);
}
}
Вывод
HashMap: {1=Java, 2=Python, 3=JavaScript} Value at key 1: Java
Также можно получить полный набор ключей, коллекцию значений или набор записей через keySet(), values() и entrySet():
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
System.out.println("Keys: " + languages.keySet());
System.out.println("Values: " + languages.values());
System.out.println("Entries: " + languages.entrySet());
}
}
Вывод
HashMap: {1=Java, 2=Python, 3=JavaScript} Keys: [1, 2, 3] Values: [Java, Python, JavaScript] Entries: [1=Java, 2=Python, 3=JavaScript]
3. Обновление значений
Метод replace(key, newValue) заменяет существующее значение для данного ключа. Возвращает старое значение или null, если ключ отсутствовал.
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("Original HashMap: " + languages);
languages.replace(2, "C++");
System.out.println("After replace(): " + languages);
}
}
Вывод
Original HashMap: {1=Java, 2=Python, 3=JavaScript} After replace(): {1=Java, 2=C++, 3=JavaScript}
4. Удаление элементов
Удалите отображение с помощью remove(key), который возвращает удалённое значение. Для условного удаления используйте remove(key, value), который удаляет только если текущее отображение совпадает с указанным значением.
import java.util.HashMap;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
String removed = languages.remove(2);
System.out.println("Removed value: " + removed);
System.out.println("Updated HashMap: " + languages);
}
}
Вывод
HashMap: {1=Java, 2=Python, 3=JavaScript} Removed value: Python Updated HashMap: {1=Java, 3=JavaScript}
Дополнительные методы HashMap
| Метод | Описание |
|---|---|
| clear() | Удаляет все отображения |
| compute() | Вычисляет новое значение для ключа |
| computeIfAbsent() | Вычисляет значение только если ключ отсутствует |
| computeIfPresent() | Вычисляет значение только если ключ существует |
| merge() | Объединяет новое отображение с существующим |
| clone() | Создаёт поверхностную копию |
| containsKey() | Проверяет наличие конкретного ключа |
| containsValue() | Проверяет наличие конкретного значения |
| size() | Количество пар ключ/значение |
| isEmpty() | Пуста ли карта |
Итерация по HashMap
Используйте for-each цикл для обхода ключей, значений или записей. Импортируйте java.util.Map.Entry для итерации по записям.
import java.util.HashMap;
import java.util.Map.Entry;
class Main {
public static void main(String[] args) {
HashMap<Integer, String> languages = new HashMap<>();
languages.put(1, "Java");
languages.put(2, "Python");
languages.put(3, "JavaScript");
System.out.println("HashMap: " + languages);
System.out.print("Keys: ");
for (Integer key : languages.keySet()) {
System.out.print(key + ", ");
}
System.out.print("\nValues: ");
for (String value : languages.values()) {
System.out.print(value + ", ");
}
System.out.print("\nEntries: ");
for (Entry<Integer, String> entry : languages.entrySet()) {
System.out.print(entry + ", ");
}
}
}
Вывод
HashMap: {1=Java, 2=Python, 3=JavaScript} Keys: 1, 2, 3, Values: Java, Python, JavaScript, Entries: 1=Java, 2=Python, 3=JavaScript,
Создание HashMap из другой Map
Создайте экземпляр HashMap с содержимым существующей карты:
import java.util.HashMap;
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> evenNumbers = new TreeMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
System.out.println("TreeMap: " + evenNumbers);
HashMap<String, Integer> numbers = new HashMap<>(evenNumbers);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
}
}
Вывод
TreeMap: {Four=4, Two=2} HashMap: {Two=2, Three=3, Four=4}
Опциональные параметры конструктора позволяют задать начальную ёмкость и коэффициент загрузки:
HashMap<K, V> numbers = new HashMap<>(8, 0.6f);
- Ёмкость: 8 записей перед рехешированием.
- Коэффициент загрузки: 0.6 запускает ресайз при заполнении 60%.
Значения по умолчанию: capacity = 16 и load factor = 0.75.
Для более глубокого погружения обратитесь к официальной документации Java или авторитетным ресурсам вроде "Effective Java" Джошуа Блоха.
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
- Понимание Java Vector: использование, особенности и сравнение с ArrayList