Java HashMap
HashMap — это хеш-таблица, которая хранит сопоставления ключ-значение.
HashMap реализует интерфейс Map, хранит данные на основе HashCode ключа, имеет очень высокую скорость доступа, допускает не более одной записи с ключом null и не поддерживает синхронизацию потоков.
HashMap неупорядочен, то есть не сохраняет порядок вставки.
HashMap наследует AbstractMap и интерфейсы Map, Cloneable и java.io.Serializable.

Типы ключей и значений HashMap могут быть одинаковыми или разными. Это могут быть ключи и значения String либо ключи Integer и значения String.
Элементы в HashMap на самом деле являются объектами. Некоторые распространённые базовые типы могут использовать свои классы-обёртки.
Таблица классов-обёрток, соответствующих базовым типам, выглядит следующим образом:
| Базовый тип | Тип ссылки |
|---|---|
| логическое значение | Boolean |
| байт | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Символ |
Класс HashMap находится в пакете java.util. Перед использованием его нужно импортировать. Синтаксис выглядит следующим образом:
import java.util.HashMap; // 引入 HashMap 类
В следующем примере мы создаём объект HashMap Sites с ключами Integer и значениями String:
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
Добавление элементов
Класс HashMap предоставляет много полезных методов. Вы можете использовать метод put() для добавления пар ключ-значение:
Пример
import java.util.HashMap;
public class ExampleTest {
public static void main(String[] args) {
// Создать объект HashMap Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// Добавить пары ключ-значение
Sites.put(1, "Google");
Sites.put(2, "Example");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
System.out.println(Sites);
}
}
Выполнение приведенного выше кода дает следующий вывод:
{1=Google, 2=Example, 3=Taobao, 4=Zhihu}
В следующем примере создается HashMap с ключами String и значениями String:
Пример
import java.util.HashMap;
public class ExampleTest {
public static void main(String[] args) {
// Создать объект HashMap Sites
HashMap<String, String> Sites = new HashMap<String, String>();
// Добавить пары ключ-значение
Sites.put("one", "Google");
Sites.put("two", "Example");
Sites.put("three", "Taobao");
Sites.put("four", "Zhihu");
System.out.println(Sites);
}
}
Выполнение приведенного выше кода дает следующий вывод:
{four=Zhihu, one=Google, two=Example, three=Taobao}
Доступ к элементам
Мы можем использовать метод get(key), чтобы получить значение, соответствующее ключу:
Пример
import java.util.HashMap;
public class ExampleTest {
public static void main(String[] args) {
// Создать объект HashMap Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// Добавить пары ключ-значение
Sites.put(1, "Google");
Sites.put(2, "Example");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
System.out.println(Sites.get(3));
}
}
Выполнение приведенного выше кода дает следующий вывод:
Taobao
Удаление элементов
Мы можем использовать метод remove(key), чтобы удалить пару ключ-значение, соответствующую ключу:
Пример
import java.util.HashMap;
public class ExampleTest {
public static void main(String[] args) {
// Создать объект HashMap Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// Добавить пары ключ-значение
Sites.put(1, "Google");
Sites.put(2, "Example");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
Sites.remove(4);
System.out.println(Sites);
}
}
Выполнение приведенного выше кода дает следующий вывод:
{1=Google, 2=Example, 3=Taobao}
Чтобы удалить все пары ключ-значение, можно использовать метод clear:
Пример
import java.util.HashMap;
public class ExampleTest {
public static void main(String[] args) {
// Создать объект HashMap Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// Добавить пары ключ-значение
Sites.put(1, "Google");
Sites.put(2, "Example");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
Sites.clear();
System.out.println(Sites);
}
}
Выполнение приведенного выше кода дает следующий вывод:
{}
Вычислить размер
Чтобы вычислить количество элементов в HashMap, можно использовать метод size():
Пример
import java.util.HashMap;
public class ExampleTest {
public static void main(String[] args) {
// Создать объект HashMap Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// Добавить пары ключ-значение
Sites.put(1, "Google");
Sites.put(2, "Example");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
System.out.println(Sites.size());
}
}
Выполнение приведенного выше кода дает следующий вывод:
4
Перебор HashMap
Вы можете использовать for-each для перебора элементов в HashMap.
Если вы хотите получить только ключи, можно использовать метод keySet(), а затем получить соответствующее значение через get(key). Если вы хотите получить только значения, можно использовать метод values().
Пример
import java.util.HashMap;
public class ExampleTest {
public static void main(String[] args) {
// Создать объект HashMap Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// Добавить пары ключ-значение
Sites.put(1, "Google");
Sites.put(2, "Example");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
// Вывод ключа и значения
for (Integer i : Sites.keySet()) {
System.out.println("key: " + i + " value: " + Sites.get(i));
}
// Вернуть все значения
for(String value: Sites.values()) {
// Вывести каждое значение
System.out.print(value + ", ");
}
}
}
Выполнение приведенного выше кода дает следующий вывод:
key: 1 value: Google key: 2 value: Example key: 3 value: Taobao key: 4 value: Zhihu Google, Example, Taobao, Zhihu,
Методы Java HashMap
hashmapСписок часто используемых методов Java HashMap выглядит следующим образом:
| Метод | Описание |
|---|---|
| clear() | Удаляет все пары ключ/значение в hashMap |
| clone() | Копирует hashMap |
| isEmpty() | Определяет, пуст ли hashMap |
| size() | Вычисляет количество пар ключ/значение в hashMap |
| put() | Добавляет пары ключ/значение в hashMap |
| putAll() | Добавляет все пары ключ/значение в hashMap |
| putIfAbsent() | Если указанный ключ не существует в hashMap, вставляет указанную пару ключ/значение в hashMap. |
| remove() | Удаляет отображение указанного ключа в hashMap |
| containsKey() | Проверяет, существует ли отображение для указанного ключа в hashMap. |
| containsValue() | Проверяет, существует ли отображение для указанного значения в hashMap. |
| replace() | Заменяет значение, соответствующее указанному ключу в hashMap. |
| replaceAll() | Заменяет все отображения в hashMap результатом выполнения заданной функции. |
| get() | Получает значение, соответствующее указанному ключу |
| getOrDefault() | Получает значение, соответствующее указанному ключу, и возвращает заданное значение по умолчанию, если ключ не найден. |
| forEach() | Выполняет указанную операцию для каждого сопоставления в hashMap. |
| entrySet() | Возвращает представление в виде множества всех сопоставлений в hashMap. |
| keySet() | Возвращает представление в виде множества всех ключей в hashMap. |
| values() | Возвращает все значения, присутствующие в hashMap. |
| merge() | Добавляет пары ключ-значение в hashMap |
| compute() | Пересчитывает значение для указанного ключа в hashMap |
| computeIfAbsent() | Пересчитывает значение для указанного ключа в hashMap и добавляет его в hashMap, если ключ не существует |
| computeIfPresent() | Пересчитывает значение для указанного ключа в hashMap при условии, что ключ существует в hashMap. |
Для получения дополнительных методов API см.:https://www.example.com/manual/jdk11api/java.base/java/util/HashMap.html
Другие расширения
Java Collections Framework