3.07M
Category: programmingprogramming

Множество коллекций Map. Хранение и обработка данных. Чаcть II

1.

Множество
коллекций Map
Хранение и обработка данных, чаcть II

2.

Разговор о…

3.

Разговор о…
1. Обзор функционала Map
2. Зачем нужен HashMap
3. HashMap и работа с ним
4. Обзор функционала TreeMap
5. Обзор функционала LinkedHashMap
6. Примеры

4.

Коллекции

5.

Иерархия коллекций

6.

Обзор функционала
Map

7.

Иерархия коллекций

8.

HashMap

9.

HashMap
Map – это множество коллекций, работающих с данными
по принципу <Ключ / Значение>.
Ключевые особенности:
● ускоренная обработка данных;
● порядок добавления не запоминается.
В HashMap элементы располагаются как угодно и могут
менять свое положение.

10.

HashMap
Map – это множество коллекций, работающих с данными
по принципу <Ключ / Значение>.
Ключевые особенности:
● допускаются только уникальные ключи, значения
могут повторяться;
● помните про null значения*;
● ускоренная обработка данных;
● порядок добавления не запоминается.

11.

HashMap
import java.util.*;
public class Ex001_HashMap {
public static void main(String[] args) {
Map<Integer, String> db = new HashMap<>();
db.put(1, "один"); System.out.println(db);
db.put(2, "два"); System.out.println(db);
db.put(3, "три"); System.out.println(db);
db.put(31, "три один"); System.out.println(db);
db.put(13, "один три"); System.out.println(db);
db.put(null, "!null"); System.out.println(db);
db.put(null, null); System.out.println(db);
}
}

12.

HashMap
Демонстрация

13.

HashMap
put(K,V) – добавить пару если или изменить значение,если ключ
имеется.
putIfAbsent(K,V) – произвести добавление если ключ не найден.
get(K) - получение значения по указанному ключу.
remove(K) – удаляет пару по указанному ключу.
containsValue(V) – проверка наличия значения.
containsKey(V) – проверка наличия ключа.
keySet() – возвращает множество ключей.
values() – возвращает набор значений.

14.

HashMap. Важное замечание
Изучить исходники.
!

15.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
!

16.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные

17.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
Map<Integer, String> db = new HashMap<>();

18.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
Map<Integer, String> db = new HashMap<>();
db.put(1, "один");

19.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
Map<Integer, String> db = new HashMap<>();
db.put(1, "один");
нам нужен hash

20.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
Map<Integer, String> db = new HashMap<>();
db.put(1, "один");
=>
2809

21.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
Map<Integer, String> db = new HashMap<>();
db.put(1, "один");
=>
2809
=> ОСТ102809

22.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
Map<Integer, String> db = new HashMap<>();
db.put(1, "один");
=>
2809
=> ОСТ102809 = 9

23.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
Map<Integer, String> db = new HashMap<>();
db.put(1, "один");
=>
2809
=> ОСТ102809 = 9

24.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
null
2, "два"
1, "один"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(1, "один");
=>
2809
=> ОСТ102809 = 9

25.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
null
2, "два"
1, "один"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(3, "три");
=>
1990
=> ОСТ101990 = 0

26.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
null
null
2, "два"
1, "один"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(3, "три");
=>
1990
=> ОСТ101990 = 0

27.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
null
null
2, "два"
1, "один"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(13, "один три");
=>
2090
=> ОСТ102090 = 0

28.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
null
2, "два"
1, "один"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(13, "один три");
=>
2090
=> ОСТ102090 = 0

29.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
null
2, "два"
1, "один"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(2, "два");
=>
1236
=> ОСТ101236 = 6

30.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
null
2, "два"
1, "один"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(2, "два");
=>
1236
=> ОСТ101236 = 6

31.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
null
2, "два"
1, "один"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(32, "три два");
=>
9999
=> ОСТ109999 = 9

32.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
2, "два"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(32, "три два");
1, "один"
=>
9999
=> ОСТ109999 = 9
32, "три два"
null

33.

HashMap
Демонстрация

34.

HashMap. Важное дополнение
Работа с парами

35.

HashMap. Важное дополнение
Работа с парами
import java.util.*;
public class Ex002_HashMapEntry {
public static void main(String[] args) {
Map<Integer, String> db = new HashMap<>();
db.putIfAbsent(1, "один");
db.put(2, "два");
db.put(3, "три");
System.out.println(db);
for (var item : db.entrySet()) {
System.out.printf("[%d: %s]\n", item.getKey(), item.getValue());
}
}
}

36.

HashMap. Важное дополнение #2. Скорость
Как ускорить работу
import java.util.*;
public class Ex003_HashMapBoost {
public static void main(String[] args) {
Map<Integer,String> map1 = new HashMap<>();
Map<Integer,String> map2 = new HashMap<>(9);
Map<Integer,String> map3 = new HashMap<>(9, 1.0f);
}
}

37.

HashMap. Важное замечание
Изучить исходники. Как хранятся данные
3, "три"
13, "один три"
2, "два"
null
null
Map<Integer, String> db = new HashMap<>();
db.put(32, "три два");
1, "один"
=>
9999
=> ОСТ109999 = 9
32, "три два"
null

38.

HashMap
Демонстрация

39.

HashMap. Любознательным
● Хэш-функции и хэш-таблицы
● Прямое связывание (хэширование с цепочками)
● Хэширование с открытой адресацией

40.

HashMap. Любознательным
● Хэш-функции и хэш-таблицы
● Прямое связывание (хэширование с цепочками)
● Хэширование с открытой адресацией
● Теория графов:
● деревья построенные на списках

41.

HashMap. Любознательным
● Хэш-функции и хэш-таблицы
● Прямое связывание (хэширование с цепочками)
● Хэширование с открытой адресацией
● Теория графов:
● деревья построенные на списках
● бинарные деревья
● сбалансированные деревья
● *алгоритм балансировки дерева

42.

HashMap. Любознательным
● Хэш-функции и хэш-таблицы
● Прямое связывание (хэширование с цепочками)
● Хэширование с открытой адресацией
● Теория графов:
● деревья построенные на списках
● бинарные деревья
● сбалансированные деревья
● *алгоритм балансировки дерева
● ** красно-черные деревья, деревья поиска

43.

TreeMap

44.

TreeMap
import java.util.*;
public class Ex004_TreeMap {
public static void main(String[] args) {
TreeMap<Integer,String> tMap = new TreeMap<>();
tMap.put(1,"один"); System.out.println(tMap);
// {1=один}
tMap.put(6,"шесть"); System.out.println(tMap);
// {1=один, 6=шесть}
tMap.put(4,"четыре"); System.out.println(tMap);
// {1=один, 4=четыре, 6=шесть}
tMap.put(3,"три"); System.out.println(tMap);
// {1=один, 3=три, 4=четыре, 6=шесть}
tMap.put(2,"два"); System.out.println(tMap);
// {1=один, 2=два, 3=три, 4=четыре, 6=шесть}
}
}

45.

TreeMap
Методы, на которые нужно обратить внимание
put(K,V)
descendingMap()
get(K)
remove(K)
descendingKeySet(V)
tailMap()
headMap()
lastEntry()
firstEntry()

46.

TreeMap
Методы, на которые нужно обратить внимание
put(K,V)
descendingMap()
get(K)
remove(K)
descendingKeySet(V)
tailMap()
headMap()
lastEntry()
В основе данной коллекции лежат красно-чёрное деревья.
Позволяют быстрее искать, но могут возникнуть «заминки»
при добавлении.
firstEntry()

47.

TreeMap
2, 4, 6, 1, 3, 5, 7, 8, 9

48.

TreeMap
2, 4, 6, 1, 3, 5, 7, 8, 9
1
2
3
4
5
6
7
8
9

49.

TreeMap
1
2, 4, 6, 1, 3, 5, 7, 8, 9
2
3
5
4
5
6
7
8
9

50.

TreeMap
1
2, 4, 6, 1, 3, 5, 7, 8, 9
2
3
4
5
3
8
5
6
7
8
9

51.

TreeMap
1
2, 4, 6, 1, 3, 5, 7, 8, 9
2
3
4
5
3
5
8
6
2
4
7
9
7
8
9

52.

TreeMap
1
2, 4, 6, 1, 3, 5, 7, 8, 9
2
3
4
5
5
8
3
6
2
1
4
7
6
9
7
8
9

53.

TreeMap
Демонстрация

54.

LinkedHashMap

55.

LinkedHashMap
«Старший брат» коллекции HashMap, который все помнит…
Помнит порядок добавления элементов ➜ более медлительный

56.

LinkedHashMap
“Старший брат” коллекции HashMap, который всё помнит…
Помнит порядок добавления элементов ➜ более медлительный
Map<Integer,String> linkmap = new LinkedHashMap<>();

57.

LinkedHashMap
import java.util.*;
public class Ex005_LinkedHashMap {
public static void main(String[] args) {
Map<Integer,String> linkmap = new LinkedHashMap<>();
linkmap.put(11, "один один");
linkmap.put(1, "два");
linkmap.put(2, "один");
System.out.println(linkmap); // {11=один один, 1=два, 2=один}
Map<Integer,String> map = new HashMap<>();
map.put(11, "один один");
map.put(2, "два");
map.put(1, "один");
System.out.println(map); // {1=один, 2=два, 11=один один}
}
}

58.

LinkedHashMap
Демонстрация

59.

HashTable

60.

HashTable
«Устаревший брат» коллекции HashMap,
который не знает про null

61.

HashTable
«Устаревший брат» коллекции HashMap, который не знает про null
import java.util.*;
public class Ex006_HashTable {
public static void main(String[] args) {
Map<Integer,String> table = new Hashtable<>();
table.put(1, "два");
table.put(11, "один один");
table.put(2, "один");
System.out.println(table); // {2=один, 1=два, 11=один один}
// table.put(null, "один"); // java.lang.NullPointerException
}
}

62.

HashTable
Демонстрация

63.

Итоги
Долго, много
и не все нужно
Переопределил equals – переопредели hashCode
Коллекции и сложные типы
English     Русский Rules