2013-04-29 3 views
11

Я читал/исследовал причину, по которой HashMap быстрее, чем HashSet.Почему HashMap быстрее, чем HashSet?

Я не совсем понимая, следующие высказывания:

  1. HashMap быстрее HashSet, поскольку значения связаны с уникальным ключом.

  2. В объекте HashSet объект-член используется для вычисления значения хэш-кода, которое может быть одинаковым для двух объектов, поэтому метод equals() используется для проверки равенства. Если он возвращает false, это означает, что два объекта разные. В HashMap значение хэш-кода вычисляется с использованием ключевого объекта.

  3. Значение hashcode HashMap рассчитывается с использованием ключевого объекта. Здесь объект-член используется для вычисления хэш-кода, который может быть одинаковым для двух объектов, поэтому метод equals() используется для проверки равенства. Если он возвращает false, это означает, что два объекта разные.

В заключение мой вопрос:

  1. Я думал HashMap и HashSet вычислить хэш-код таким же образом. Почему они разные?

  2. Можете ли вы привести конкретный пример того, как HashSet и HashMap вычислять хэш-код по-разному?

  3. Я знаю, что такое «ключевой объект», но что он означает «объект-член»?

  4. HashMap может делать то же, что и HashSet, и быстрее. Зачем нам нужен HashSet? Пример:

    HashMap <Object1, Boolean>= new HashMap<Object1, boolean>(); 
    map.put("obj1",true); => exist 
    map.get("obj1"); =>if null = not exist, else exist 
    
+3

Вы должны прочитать о различии между 'Map' и' Set'. Это два разных типа «Коллекция». Как только вы это сделали, должно быть понятно, почему получение определенного объекта с карты происходит быстрее, чем из набора. – Magnilex

+0

Hashset построен на HashMap. И Set используется для уникальности. Это не пара коллекций ключевых значений. –

+0

Да. Я знаю, что они реализуют разные интерфейсы. Но некоторые люди говорят, что hashset использует hashmap в backend. Если это правда, почему hashset будет медленнее, чем hashmap? – runcode

ответ

18

Производительность:

Если вы посмотрите на исходный код HashSet (по крайней мере, JDK 6, 7 и 8), он использует HashMap внутри, так что в основном делает именно что вы делаете с образцом кода.

Итак, если вам нужна реализация Set, вы используете HashSet, если вам нужна карта - HashMap. Код с использованием HashMap вместо HashSet будет иметь ту же производительность, что и при использовании HashSet напрямую.

Выбор правильного Collection

Карта - карты ключей к значениям (ассоциативный массив) - http://en.wikipedia.org/wiki/Associative_array.

Set - коллекция, которая не содержит повторяющихся элементов - http://en.wikipedia.org/wiki/Set_(computer_science).

Если вам нужна ваша коллекция, это проверить, присутствует ли элемент там - используйте Set.Ваш код будет более чистым и более понятным для других.

Если вам нужно сохранить некоторые данные для своих элементов - используйте карту.

+2

Что сказал Денис. Кроме того, вы можете обернуть любую карту с помощью набора, используя Collections.newSetFromMap. –

0

Ни один из этих ответов действительно не объясняет почему HashMap быстрее, чем HashSet. Оба они должны вычислить хэш-код, но подумайте о характере ключа HashMap - это, как правило, простая строка или даже число. Вычисление hashcode этого намного быстрее, чем вычисление hashcode по умолчанию для всего объекта. Если ключ HashMap был тем же самым объектом, что и в HashSet, не было бы реальной разницы в производительности. Разница заключается в том, какой объект является ключом HashMap.

Смежные вопросы