Содержание
Некоторое время назад у меня есть особый случай, в котором я должен сравнить ключ карты на основе equality operator (==) , Оператор равенства (==) сравнивает ссылки (адреса в памяти) двух ключей как два разных числа.
С другой стороны, HashMap является наиболее часто используемым компонентом Java Collection Framework, который сравнивает уникальность ключа с помощью equals() метод.
Также, IdentityHashMap не использует хеш из object.hashCode() но использует System.identityHashCode(object) , Мы могли бы использовать IdentityHashMap для изменяемых объектов, чей хэш-код изменяется во время выполнения.
Если вы хотите узнать больше о equals() а также == который применяется on String Object затем следуйте этому руководству: https://crunchify.com/how-to-override-equals-and-hashcode-method-in-java/ .
Базовый тест, который демонстрирует поведение equals () и ==:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
пакет crunchify. ком . учебные пособия ;
Импортировать Java. Util. HashMap ;
Импортировать Java. Util. IdentityHashMap ;
Импортировать Java. Util. Карта ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyIdenityHashMapVsHashMapSample {
общественности статический недействительным main ( Строка [ ] аргументы ) {
Карта < Строка , Строка > crunchifyIdentityHashMap знак равно новый IdentityHashMap < String , Строка > ( ) ;
Карта < Строка , Строка > crunchifyHashMap знак равно новый HashMap < String , Строка > ( ) ;
// Давайте посмотрим, что происходит, когда мы помещаем уникальный ключ в IdentityHashMap
crunchifyIdentityHashMap . положить ( Компания , Хруст ) ;
// это считается другим объектом для оператора ==
crunchifyIdentityHashMap . положить ( новый Строка ( «Компания» ) , Гугл ) ;
crunchifyIdentityHashMap . положить ( Компания , «Фейсбук» ) ;
Система. вне. println ( Размер набора ключей crunchifyIdentityHashMap: + crunchifyIdentityHashMap . keySet ( ) . размер ( ) ) ;
// Давайте рассмотрим, что происходит, когда мы помещаем уникальный ключ в HashMap
crunchifyHashMap . положить ( Компания , Хруст ) ;
// key1.equals (key2) возвращает true, следовательно, удаляет старое значение
crunchifyHashMap . положить ( новый Строка ( «Компания» ) , Гугл ) ;
crunchifyHashMap . положить ( Компания , «Фейсбук» ) ;
Система. вне. println ( Размер набора ключей crunchifyHashMap: + crunchifyHashMap . keySet ( ) . размер ( ) ) ;
}
}
|
Результат:
|
1
2
|
Размер набора ключей : crunchifyIdentityHashMap : 2
crunchifyHashMap Keyset Размер: 1
|
Давайте проведем тестирование производительности на обеих картах:
- Создать класс Java :
CrunchifyIdentityHashMapVsHashMapPerformance.java startCrunchifyTest()- Создает случайный размер карты в миллионах
- Создание и инициализация
crunchifyString[]Объект String Array с сгенерированным выше случайным числом с текстом:This is Crunchify's Test # number
crunchifyCompareIdentityHashMapVsHashMap(String[] crunchifyString, MapcrunchifyMap, String name) - Передайте все необходимые параметры этому методу
crunchifyMapбудет иметь значение IdentityHashMap / HashMap- Выполните итерацию по crunchifyString [] и поместите значения в Map — эта операция занимает некоторое время
- Выполните итерацию по crunchifyString [] и получите значения из Map — эта операция занимает некоторое время
- Мы выясним время выполнения обеих вышеуказанных операций, чтобы мы могли сравнить, какое из них лучше для вышеуказанных операций ? IdentityHashMap ИЛИ HashMap
- Распечатать результат выше
- Выполните вышеуказанные задачи 2 и 3 всего 8 раз.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
пакет crunchify. ком . учебные пособия ;
Импортировать Java. Util. HashMap ;
Импортировать Java. Util. IdentityHashMap ;
Импортировать Java. Util. Карта ;
Импортировать Java. Util. Случайный ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyIdentityHashMapVsHashMapPerformance {
статический Случайный ранд знак равно новый Случайный ( ) ;
частный статический недействительным startCrunchifyTest ( ) {
// Запустим тест 5 раз
за ( int я знак равно 0 ; я < 15 ; ++ я ) {
// Давайте создадим случайный размер карты, который мы будем использовать в IdentityHashMap и HashMap
ИНТ randomMapSize знак равно 1000000 + рандов. nextInt ( 9000000 ) ;
Строка [ ] crunchifyString знак равно новый String [ randomMapSize ] ;
за ( int J знак равно 0 ; J < randomMapSize ; ++ j )
// Назначаем нижнюю строку для объекта crunchifyString
crunchifyString [ j ] знак равно Это тест Crunchify # + j ;
Система. вне. println ( / nIteration # + я + — Создание строки с размером: + randomMapSize ) ;
crunchifyCompareIdentityHashMapVsHashMap ( crunchifyString , новый HashMap < String , Integer > ( randomMapSize ) , HashMap ) ;
// Запускает сборщик мусора
Система. gc ( ) ;
crunchifyCompareIdentityHashMapVsHashMap ( crunchifyString , новый IdentityHashMap < String , Integer > ( randomMapSize ) ,
IdentityHashMap ) ;
// Запускает сборщик мусора
Система. gc ( ) ;
}
}
/ **
* @param crunchifyString
* @param crunchifyMap
*: IdentityHashMap / HashMap
* @param name
* /
частный статический недействительным crunchifyCompareIdentityHashMapVsHashMap ( String [ ] crunchifyString , Карта < Строка , Целое число > crunchifyMap ,
строка имя ) {
долго Начните знак равно Система. currentTimeMillis ( ) ;
// помещаем crunchifyString String [] на карту
за ( int положил знак равно 0 ; положил < crunchifyString . длина ; ++ поставь )
crunchifyMap . положить ( crunchifyString [ положить ] , положить ) ;
логический результат знак равно ложь ;
за ( int получить знак равно 0 ; получить < crunchifyString . длина ; ++ получить ) {
если ( crunchifyMap . get ( crunchifyString [ get ] ) ! знак равно получить )
результат знак равно правда ;
}
Система. вне. println ( имя + время заняло: / т + ( Система . CurrentTimeMillis ( ) — начать ) / 1000. + сек ) ;
// Проверка на расхождение результатов
если ( crunchifyMap . size ( ) ! знак равно crunchifyString . длина )
Система. вне. println ( «Пожалуйста, проверьте размер. Тест не пройден» ) ;
если ( результат )
Система. вне. println ( «Результат не удалось ..» ) ;
}
общественности статический недействительным main ( Строка [ ] аргументы ) {
Система. вне. println ( IdentityHashMap Vs. HashMap Сравнительный тест запущен … ) ;
// метод для сравнения IdentityHashMap и HashMap
startCrunchifyTest ( ) ;
}
}
|
Результат:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
IdentityHashMap Vs. Сравнительный тест HashMap начался . , ,
итерация # 0 — Создание строки с размером: 6964175
HashMap затраченное время : 3,155 сек
IdentityHashMap затраченное время : 1,517 сек
итерация # 1 — Создание строки с размером: 6556459
HashMap затраченное время : 3,415 сек
IdentityHashMap затраченное время : 1,466 сек < == IdentityHashMap дает лучший результат для большой объект
итерация # 2 — Создание строки с размером: 9567664
HashMap затраченное время : 4,173 сек
IdentityHashMap затраченное время : 2,339 сек < == лучше
итерация # 3 — Создание строки с размером: 4230755
HashMap затраченное время : 0,372 сек
IdentityHashMap затраченное время : 0,911 сек
итерация # 4 — Создание строки с размером: 7821718
HashMap затраченное время : 1,096 сек
IdentityHashMap затраченное время : 0,812 сек
итерация # 5 — Создание строки с размером: 8125421
HashMap затраченное время : 4,883 сек
IdentityHashMap затраченное время : 1,876 сек < == лучше
итерация # 6 — Создание строки с размером: 3166432
HashMap затраченное время : 0,537 сек
IdentityHashMap затраченное время : 0,708 сек
итерация # 7 — Создание строки с размером: 2821415
HashMap затраченное время : 0,227 сек
IdentityHashMap затраченное время : 0,621 сек
|
Наблюдение:
Как вы можете видеть здесь в результате, для больших карт IdentityHashMap работает намного лучше. Зачем? IdentityHashMap doesn't use equals() and hashcode() methods , которые считаются очень дорогостоящими.
Просто к вашему сведению:
Вышеупомянутые операции, которые мы выполняем для помещения и получения значений из и в Map, очень нагружают процессор .
0.00 (0%) 0 votes







