Почему HashMap быстрее, чем HashSet?
Я читал/исследовал причину, по которой HashMap
быстрее, чем HashSet
.
Я не совсем понимаю следующие утверждения:
-
HashMap
быстрее, чем HashSet
, потому что значения связаны с уникальным ключом.
-
В HashSet
объект-член используется для вычисления значения хэш-кода, которое может быть одинаковым для двух объектов, поэтому метод equals()
используется для проверки равенства. Если он возвращает false
, это означает, что два объекта разные. В HashMap
значение хэш-кода вычисляется с использованием ключевого объекта.
-
Значение hashcode HashMap
вычисляется с использованием ключевого объекта. Здесь объект-член используется для вычисления хэш-кода, который может быть одинаковым для двух объектов, поэтому метод equals()
используется для проверки равенства. Если он возвращает false
, это означает, что два объекта различаются.
В заключение моего вопроса:
-
Я думал, что HashMap
и HashSet
вычисляют хэш-код таким же образом. Почему они разные?
-
Можете ли вы привести конкретный пример того, как HashSet
и HashMap
вычислять хэш-код по-другому?
-
Я знаю, что такое "ключевой объект", но что это означает "объект-член"?
-
HashMap
может выполнять те же функции, что и HashSet
, и быстрее. Зачем нам нужно HashSet
? Пример:
HashMap <Object1, Boolean>= new HashMap<Object1, boolean>();
map.put("obj1",true); => exist
map.get("obj1"); =>if null = not exist, else exist
Ответы
Ответ 1
Производительность:
Если вы посмотрите на исходный код HashSet (по крайней мере, JDK 6, 7 и 8), он использует HashMap внутренне, поэтому он в основном делает именно то, что вы делаете с образцом кода.
Итак, если вам нужна реализация Set, вы используете HashSet, если вам нужна карта - HashMap. Код с использованием HashMap вместо HashSet будет иметь ту же производительность, что и при использовании HashSet напрямую.
Выбор правильной коллекции
Map - сопоставляет ключи значениям (ассоциативный массив) - http://en.wikipedia.org/wiki/Associative_array.
Set - коллекция, которая не содержит повторяющихся элементов - http://en.wikipedia.org/wiki/Set_(computer_science).
Если вам нужна только ваша коллекция, это проверить, присутствует ли элемент там - используйте Set. Ваш код будет более чистым и более понятным для других.
Если вам нужно сохранить некоторые данные для своих элементов - используйте Map.
Ответ 2
Ни один из этих ответов не объясняет, почему HashMap быстрее, чем HashSet. Оба они должны вычислить хэш-код, но подумайте о характере ключа HashMap - это, как правило, простая строка или даже число. Вычисление hashcode этого намного быстрее, чем вычисление hashcode по умолчанию для всего объекта. Если ключ HashMap был тем же самым объектом, что и в HashSet, не было бы реальной разницы в производительности. Разница заключается в том, какой объект является ключом HashMap.