Почему 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.