Разница между HashSet и HashMap? - PullRequest
155 голосов
/ 05 мая 2010

Помимо того, что HashSet не допускает дублирование значений, в чем разница между HashMap и HashSet?

Я имею в виду реализацию? Это немного расплывчато, потому что оба используют хеш-таблицы для хранения значений.

Ответы [ 19 ]

286 голосов
/ 05 мая 2010

HashSet - это набор , например {1,2,3,4,5}

HashMap - это карта key -> value (ключ к значению), например {a -> 1, b -> 2, c -> 2, d -> 1}

Обратите внимание, что в моем примере выше, в HashMap не должно быть дубликатов ключей, но они могут иметь дублирующиеся значения.

В HashSet не должно быть повторяющихся элементов.

140 голосов
/ 05 мая 2010

Это совершенно разные конструкции.A HashMap является реализацией Map.A Map сопоставляет ключи со значениями.Поиск ключа происходит с использованием хэша.

С другой стороны, HashSet является реализацией Set. Набор предназначен для соответствия математической модели набора.Как вы заметили, HashSet использует HashMap для поддержки своей реализации.Тем не менее, он реализует совершенно другой интерфейс.

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

58 голосов
/ 05 сентября 2015

HashSet

  1. Класс HashSet реализует интерфейс Set
  2. В HashSet мы храним объекты (элементы или значения) например Если у нас есть HashSet строковых элементов, то он может изобразить набор элементов HashSet: {«Hello», «Hi», «Bye», «Run»}
  3. HashSet не позволяет дублировать элементы, которые означают, что вы не может хранить повторяющиеся значения в HashSet.
  4. HashSet разрешает иметь одно нулевое значение.
  5. HashSet не синхронизирован, что означает, что он не подходит для поточно-ориентированных операций до тех пор, пока не будет синхронизирован явно. [Схожесть]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 
    

HashMap

  1. Класс HashMap реализует интерфейс Map
  2. HashMap is используется для хранения пар ключ-значение. Короче говоря, он поддерживает отображение ключа и значения (класс HashMap примерно эквивалентен Hashtable, за исключением того, что он не синхронизирован и допускает нулевые значения.) Это как вы можете представлять элементы HashMap, если он имеет целочисленный ключ и значение типа String: например, {1 -> «Привет», 2 -> «Привет», 3 -> «Пока», 4 ->»Run»}
  3. HashMap не допускает дублирование ключей, однако позволяет иметь дублирующиеся значения.
  4. HashMap разрешает один нулевой ключ и любое количество нулевых значений.
  5. HashMap не синхронизируется, что означает, что они не подходят для поточно-ориентированных операций, пока не синхронизированы явно. [Схожесть]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 
    

Пожалуйста, обратитесь к этой статье , чтобы найти больше информации.

34 голосов
/ 05 мая 2010

Обидно, что оба их названия начинаются с Хэш . Это наименее важная часть из них. Важные части идут после Хеша - Set и Map , как указали другие. Соответственно, это: Set - неупорядоченная коллекция - и Map - коллекция с доступом по ключу. Они реализованы с помощью хэшей - отсюда и имена, но их сущность скрыта за этой частью их имен.

Не смущайтесь их именами; это глубоко разные вещи.

3 голосов
/ 05 мая 2010

HashSet позволяет хранить объекты в наборе, где HashMap позволяет хранить объекты на основе ключа и значения. Каждый объект или сохраненный объект будет иметь ключ.

2 голосов
/ 05 мая 2010

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

2 голосов
/ 11 мая 2017

Hashset Внутренне реализует HashMap. Если вы видите внутреннюю реализацию , значения, вставленные в HashSet, сохраняются как ключи в HashMap, а значение является объектом Dummy класса Object.
Разница между HashMap и HashSet: -

  1. HashMap содержит пары ключ-значение, и к каждому значению можно обращаться по ключу, где HashSet необходимо повторять каждый раз, так как метод get отсутствует.
  2. HashMap реализует интерфейс карты и допускает одно нулевое значение в качестве ключа и несколько нулевых значений в качестве значений. При использовании HashSet реализуется интерфейс Set, допускается только одно нулевое значение и не допускается дублирование значений (помните, что допускается использование одного нулевого ключа) в ключе HashMap, следовательно, одно нулевое значение в HashSet, поскольку HashSet реализует HashMap внутренне).
  3. HashSet и HashMap не поддерживают порядок вставки во время итерации.
1 голос
/ 16 апреля 2014

Различия между HashSet и HashMap в Java

HashSet внутренне использует HashMap для хранения objects.when метод add (String), вызывающий его, вызывает метод put (key, value) HahsMap, где key = String object & value = new Object (Dummy). Поэтому он не поддерживает дубликатов, поскольку ключи ничего, кроме объекта значения.

Объекты, которые хранятся в качестве ключа в Hashset / HashMap, должны переопределять хэш-код и равно контракту.

Ключи, которые используются для доступа / сохранения объектов-значений в HashMap, должны быть объявлены как Final, поскольку при его изменении объект Value не может быть найден и возвращает ноль.

1 голос
/ 05 февраля 2013

Различия между HashSet и HashMap в Java

1) Первое и наиболее существенное различие между HashMap и HashSet заключается в том, что HashMap представляет собой реализацию интерфейса Map, в то время как HashSet представляет собой реализацию интерфейса Set, что означает, что HashMap является структурой данных на основе ключевых значений и HashSet гарантирует уникальность, не допуская дублирования. На самом деле HashSet является оболочкой для HashMap в Java, если вы посмотрите на код метода add (E e) HashSet.java, вы увидите следующий код:

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

, где помещение объекта на карту в качестве ключа и значения является конечным объектом PRESENT, который является фиктивным.

2) Второе отличие между HashMap и HashSet заключается в том, что мы используем метод add () для помещения элементов в Set, но мы используем метод put () для вставки ключа и значения в HashMap в Java.

3) HashSet допускает только один нулевой ключ, но HashMap может разрешать один нулевой ключ + несколько нулевых значений.

В этом и заключается различие между HashSet и HashMap в Java. Таким образом, HashSet и HashMap - это два разных типа Коллекции, один из которых является Установленным, а другой - Картой.

1 голос
/ 05 мая 2010

Отличия: по отношению к иерархии: HashSet реализует Set. HashMap реализует Map и хранит сопоставление ключей и значений.

Использование HashSet и HashMap по отношению к базе данных поможет вам понять значение каждого из них.
HashSet: обычно используется для хранения уникальных объектов коллекции. Например: он может использоваться в качестве класса реализации для хранения отношения «многие к одному» между
Предмет класса и ставка класса, где (у предмета много предложений) HashMap: используется для сопоставления ключа со значением. Значение может быть нулевым или любым объектом / списком объектов (который сам по себе является объектом).

...