Топ-100Интерфейс Map в Java - CodOrbits
LogoCodOrbits

Раздел: Коллекции

Изучите Java Collections Framework: List, Set, Map и другие структуры данных для эффективной работы с данными

Все разделы
Иконка Коллекции

Интерфейс 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 коллекции внутри

Search Icon

Довольно важно знать как Hash коллекции работают под капотом.

HashMap под капотом разбит на 16 linkedlist в которых собственно и хранятся пары. То есть сам HashMap это тоже массив из 16 ячеек, но каждая ячейка представляет собой отдельный LinkedList.

Добавление элемента в HashMap происходит так, что сначала по ключу вычисляется некий код, который называется hashcode, а по нему индекс нужного LinkedList-а в массиве из 16 LinkedList и в linkedlist-е с этим индексом сохраняется элемент.

При выборке из HashMap, например с помощью get, ранее вставленного элемента, будет происходить тот же процесс, что и при его вставке, то есть расчет hashcode по ключу, который был передан в get и собственно выборка из того linkedlist-а который соответствует рассчитанному hashcode.

Example

Например:

Очевидно, что и при вставке, например, ключа 10, и при выборке по этому ключу будет рассчитан один и тот же hashcode. Соответственно и вставка ключа 10 и выборка по ключу 10 будет происходить в одном и том же linkedlist-е.

Для ключа, например 13, вставка и выборка уже, возможно, попадет на другой linkedlist. А возможно попадет на тот linkedlist где перед перед этим вставилось 10. Зависит от рассчитанного hashcode для числа 13.

Отсюда очевиден смысл hashmap, что поскольку мы и вставляем и выбираем в одном и том же linkedlist-e, то выборка ясное дело всегда идет в одном из 16 linkedList-ов, а не во всех, и это ясное дело лучше, чем если бы мы вибирали из всех шестнадцати как в одном большом linkedlist-e.

Search Icon

Также важно упомянуть, что поиск нужного 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
мин.

Similar Articles Icon
Divider

Потоки ввода/вывода. PrintWriter и PrintStream

10
мин.

Similar Articles Icon
Divider

FileStream в Java: чтение и запись файлов

7
мин.

Similar Articles Icon