Интерфейс Map в Java
Last updated: 5 мая 2025 г.Благодаря классам реализующим Map
можно создать массив из пар ключ-значение. То есть один элемент этого массива это пара.
Пример программы:
1import java.util.*;
2
3public class Map {
4 public static void main(String[] args) {
5 //создаем коллекцию
6 HashMap< Integer, String > hMap = new HashMap< Integer, String >();
7 //добавление элемента
8 //видим числовой ключ и соответствующее ему значение
9 hMap.put(34, "Sunday");
10 hMap.put(56, "Monday");
11 hMap.put(85, "Tuesday");
12 hMap.put(34, "Wednesday");
13 hMap.put(556, "Monday");
14 hMap.put(724, "Sunday");
15 // удаление элемента
16 hMap.remove(85);
17 //В hashset нету get по индексу и не наследует iterator
18 //поэтому передаем значения с помощью метода values
19 //в конструктор другой коллекции, которую можно перебирать.
20 ArrayList< String > hMapValues = new ArrayList< String >(hMap.values());
21 for(int i = 0; i < hMapValues.size(); i++) {
22 System.out.print(hMapValues.get(i) + " ");
23 }
24 System.out.println();
25 //или keySet если нужно перебирать ключи
26 ArrayList< Integer > hMapKeys = new ArrayList< Integer >(hMap.keySet());
27 for(int i = 0; i < hMapKeys.size(); i++) {
28 System.out.print(hMapKeys.get(i) + " ");
29 }
30 System.out.println();
31 // проверка на наличие элемента с таким ключем в списке
32 System.out.println(hMap.containsKey(56));
33 // проверка на наличие элемента с таким значением в списке
34 System.out.println(hMap.containsValue("Sunday"));
35 // можно также получить значение элемента hashmap по ключу
36 System.out.println(hMap.get(34));
37 }
38}
Вывод:

Hash коллекции внутри
Довольно важно знать как Hash коллекции работают под капотом.
HashMap под капотом разбит на 16 linkedlist
в которых собственно и хранятся пары. То есть сам HashMap это тоже массив из 16 ячеек, но каждая ячейка представляет собой отдельный LinkedList.
Добавление элемента в HashMap происходит так, что сначала по ключу вычисляется некий код, который называется hashcode
, а по нему индекс нужного LinkedList-а в массиве из 16 LinkedList и в linkedlist-е с этим индексом сохраняется элемент.
При выборке из HashMap, например с помощью get
, ранее вставленного элемента, будет происходить тот же процесс, что и при его вставке, то есть расчет hashcode по ключу, который был передан в get
и собственно выборка из того linkedlist-а который соответствует рассчитанному hashcode.
Например:
Очевидно, что и при вставке, например, ключа 10, и при выборке по этому ключу будет рассчитан один и тот же hashcode. Соответственно и вставка ключа 10 и выборка по ключу 10 будет происходить в одном и том же linkedlist-е.
Для ключа, например 13, вставка и выборка уже, возможно, попадет на другой linkedlist. А возможно попадет на тот linkedlist где перед перед этим вставилось 10. Зависит от рассчитанного hashcode для числа 13.
Отсюда очевиден смысл hashmap, что поскольку мы и вставляем и выбираем в одном и том же linkedlist-e, то выборка ясное дело всегда идет в одном из 16 linkedList-ов, а не во всех, и это ясное дело лучше, чем если бы мы вибирали из всех шестнадцати как в одном большом linkedlist-e.
Также важно упомянуть, что поиск нужного linkedlist-a из 16 по hashcode происходит за константное время, проще говоря скорость лучше не бывает.
TreeMap
TreeMap
– хранит пары в виде дерева, что позволяет быстрее искать элементы.
Все элементы отсортированы по ключу.
TreeMap
лучше всего подходит для нахождения диапазонов
Пример программы:
1import java.util.*;
2
3public class Map {
4 public static void main(String[] args) {
5 // создаем коллекцию
6 TreeMap< Integer, String > tMap = new TreeMap< Integer, String >();
7 // добавление элемента
8 tMap.put(556, "Monday");
9 tMap.put(56, "Monday");
10 tMap.put(85, "Tuesday");
11 tMap.put(34, "Wednesday");
12 tMap.put(815, "Saturday");
13 tMap.put(724, "Sunday");
14 // удаление элемента
15 tMap.remove(85);
16 // в TreeMap нету get по индексу и не наследует iterator
17 // поэтому передаем значения с помощью метода values
18 // конструктор другой коллекции, которую можно перебирать
19 ArrayList< String > tMapValues = new ArrayList< String >(tMap.values());
20 for(int i = 0; i < tMapValues.size(); i++) {
21 System.out.print(tMapValues.get(i) + " ");
22 }
23
24 System.out.println();
25 // или keySet если нужно перебирать ключи
26 ArrayList< Integer > tMapKeys = new ArrayList< Integer >(tMap.keySet());
27 for(int i = 0; i < tMapKeys.size(); i++) {
28 System.out.print(tMapKeys.get(i) + " ");
29 }
30
31 System.out.println();
32 // проверка на наличие элемента с таким ключем в списке
33 System.out.println(tMap.containsKey(56));
34 // проверка на наличие элемента с таким значением в списке
35 System.out.println(tMap.containsValue("Sunday"));
36 // для нахождения диапазонов
37 System.out.println(tMap.tailMap(556)); // выведет все элементы после 556
38 System.out.println(tMap.headMap(815)); // выведет все элементы до 815
39 // по результатам можно увидеть что элементы в порядке увеличения
40 }
41}
Вывод:

LinkedHashMap
LinkedHashMap
– элементы в отличие от hashmap содержат ссылку на предыдущий добавленный элементы и на следующий добавленный, как у LinkedList.
Проще говоря, это гибрид HashMap и LinkedList.
То есть лучше использовать когда элементы часто вставляются/удаляются.
Пример программы:
1import java.util.*;
2
3public class Map {
4 public static void main(String[] args) {
5 // создаем коллекцию
6 LinkedHashMap< Integer, String > lhMap = new LinkedHashMap< Integer, String >();
7 // добавление элемента
8 lhMap.put(556, "Monday");
9 lhMap.put(556, "Monday");
10 lhMap.put(85, "Tuesday");
11 lhMap.put(34, "Wednesday");
12 lhMap.put(815, "Saturday");
13 lhMap.put(724, "Sunday");
14 // удаление элемента
15 lhMap.remove(85);
16 //в linkedhashset нету get по индексу и не наследует iterator
17 //поэтому передаем значения с помощью метода values
18 //в конструктор другой коллекции, которую можно перебрать
19 ArrayList< String > lhMapValues = new ArrayList< String >(lhMap.values());
20 for(int i = 0; i < lhMapValues.size(); i++) {
21 System.out.print(lhMapValues.get(i)+" ");
22 }
23
24 System.out.println();
25 //или keySet если нужно перебрать ключи
26 ArrayList< Integer > lhMapKeys = new ArrayList< Integer >(lhMap.keySet());
27 for(int i = 0; i < lhMapKeys.size(); i++) {
28 System.out.print(lhMapKeys.get(i)+" ");
29 }
30
31 System.out.println();
32 // проверка на наличие элемента с таким ключем в списке
33 System.out.println(lhMap.containsKey(556));
34 // проверка на наличие элемента с таким значением в списке
35 System.out.println(lhMap.containsValue("Sunday"));
36 // По результатам можно видеть что элементы в порядке добавления
37 }
38}
Вывод:

Следующие уроки
Интерфейс Set в Java
9
мин.
Потоки ввода/вывода. PrintWriter и PrintStream
10
мин.
FileStream в Java: чтение и запись файлов
7
мин.