2010-05-05 2 views
120

Помимо того факта, что HashSet не допускает повторяющихся значений, в чем разница между HashMap и Hashset?Разница между HashSet и HashMap?

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

+0

HashSet реализован с использованием HashMap – therealprashant

+0

Я думаю, что знание того, почему HashSet отличается от ArrayList, поможет вам понять ответ на ваш предыдущий вопрос: https://stackoverflow.com/questions/18706870/java-hashset-vs-array-performance – djangofan

ответ

112

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

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

Если вы ищете то, что будет лучшим Collection для ваших целей, это Tutorial является хорошим отправным местом. Если вы действительно хотите узнать, что происходит, there's a book for that тоже.

+0

Ключевой поиск происходит с использованием hash ..... Итак, может быть хеш-код, сопоставленный более чем одному ключу ...? – SpikETidE

+1

так .. все это сводится к «если вы не хотите, чтобы дубликаты использовали hashSet ... Если вы не беспокоитесь о дубликатах, используйте HashMap» ....? – SpikETidE

+0

Это утверждение немного упрощено. Накрывается еще кое-что »,« Возвращает хэш-значение для указанного объекта. В дополнение к собственному хэш-коду объекта этот метод применяет «дополнительную хэш-функцию », которая защищает от хэш-функций _poor_ quality. Это критическое значение, потому что HashMap использует мощность в двух таблицах хэш-таблицы длиной . «Http://weblogs.java.net/blog/2005/06/18/hashmap-implementation - однако, если вы посмотрите на документ, вы будете посмотрите, что этот хеш распределяет вещи по «ведрам», поэтому в конце я верю, что две вещи могут быть отображены одним и тем же ведром. – justkt

0

A HashSet выполнен в виде HashMap. Это сопоставление между ключом и объектом PRESENT.

+2

Что такое «ПРИСУТСТВУЮЩИЙ объект»? – EJP

0

Вы в значительной степени ответили на свой вопрос - hashset не позволяет дублировать значения. было бы тривиально построить хэшсет, используя хеш-карту поддержки (и просто проверку, чтобы узнать, существует ли это значение). Я предполагаю, что различные реализации java либо делают это, либо реализуют некоторый собственный код, чтобы сделать это более эффективно.

+1

@oedo - 'java.util.HashSet' говорит, что это поддерживается' java.util.HashMap'. – justkt

+1

Невозможность дублирования не является разницей между ними. – EJP

0

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

EDIT: Чтобы обратиться к комментарию Матфея, он прав; Я сделал это назад. Внутренний HashMap имеет ключ с объектами, которые составляют элементы Set. Значения HashMap - это объект, который просто хранится в ведрах HashMap.

+0

Это не так. Элементы набора напрямую используются в качестве ключей HashMap. –

3

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

2

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

+0

Но в hashSet хэш-код отображает значение .... – SpikETidE

+1

@SpikETidE Это деталь того, как реализована уникальность, но смысл HashSet заключается в реализации набора. –

+0

так .. все это сводится к «если вы не хотите, чтобы дубликаты использовали hashSet ... Если вы не беспокоитесь о дубликатах, используйте HashMap» ....? – SpikETidE

252

HashSet - это комплект, т.е. {1,2,3,4,5}

HashMap является ключ -> значение (ключ к значению) карта, например, {а -> 1, б -> 2, с -> 2, д -> 1}

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

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

+25

Это самый ясный ответ ИМО. –

+0

Но (самая интересная) причина путаницы в том, что даже в HashSet вам нужен «ключ» для доступа к элементам. I.e., объекты, даже в математике, имеют имена (или адреса), если они должны быть доступны или ссылки. Таким образом, в этом реальном смысле HashSet является особенно простой HashMap, с именами (или адресами) ее элементов. –

1

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

Так HashMap содержит элементы, и HashSet запоминает их хеши.

+0

Сравнивая их хэши и вызывая их методы 'equals()'. – EJP

1

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

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

30

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

Не путать их имена; они очень разные вещи.

+0

Хорошее объяснение, любые мысли о том, почему их имя начинается с хэша? –

+0

@HiteshSahu Они оба реализованы с таблицами Hash (https://en.wikipedia.org/wiki/Hash_table). Это хорошая структура данных для представления набора, эффективного в правильном направлении и, по сути, ключи HashMap реализованы как HashSet. Таким образом, любой, кто их назвал, столкнулся с некоторыми проблемами с их осуществлением и сосредоточился на реализации, а не на своей цели (по предположению). –

-1

В основном в HashMap пользователь должен указать как ключ, так и значение, тогда как в HashSet вы предоставляете только значение, ключ генерируется автоматически из значения с помощью хэш-функции. Поэтому, имея ключ и значение, HashSet может быть сохранен как HashMap внутренне.

+0

Ключ * * значение в HashSet. – EJP

-1

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

+0

Если это правда, HashSet не может хранить несколько объектов с одним и тем же хэш-кодом, и это так. – EJP

0

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

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

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

где его сдача объект в карту как ключ и значение является конечным объектом НАСТОЯЩИМ который является фиктивным.

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

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

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

-1

HashMaps Разрешить один нулевой ключ и нулевые значения. Они не синхронизированы, что повышает эффективность. Если это необходимо, вы можете синхронизировать их с помощью Collections.SynchronizedMap()

Hashtables не разрешать нулевые ключи и синхронизироваться.

+0

Он не просил уйти в Хэстэблс. Не отвечает на вопрос. – EJP

1

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

HashSet внутренне использует HashMap для хранения objects.when добавить метод (String) называется он вызывает HahsMap поставил метод (ключ, значение), где ключ = объект Строка & value = new Object (Dummy). Также он не поддерживает дубликатов, потому что ключи - это ничего, кроме Value Object.

Объекты, которые хранятся как ключ в Hashset/HashMap, должны переопределять hashcode & равноценно.

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

0

HashSet

HashSet является реализация Set Interface, который не позволяет дублировать значение все методы, которые находятся в коллекции Framework также в интерфейсе настройки по умолчанию, но когда мы говорим о Hash установить главное объекты, которые будут храниться в HashSet, должны переопределять метод equals() и hashCode(), чтобы мы могли проверить равенство, и никакое дублирующее значение не хранится в нашем наборе. Если мы создали наши собственные объекты, нам нужно реализовать hashCode() и равно() таким образом, чтобы они могли корректно сравнивать объекты при хранении в наборе, чтобы дублирующие объекты не сохранялись, если мы не переопределили этот метод, объекты будут принимать по умолчанию реализацию этого метода обмундирование оливково-серого цвета

Метод: общественных логического дополнения (Object о) Метод используется для добавления элемента в наборе, который возвращает ложь, если это повторяющееся значение в случае HashSet иначе возвращает истину, если успешно добавлены.

HashMap

HashMap является реализация карт интерфейс, который отображает ключ к ключам value.Duplicate не допускаются на карте.В основном карта Интерфейс имеет два класса реализации HashMap и TreeMap, основное различие заключается в том, что TreeMap поддерживает порядок объектов, но HashMap не будет. HashMap допускает нулевые значения и нулевые ключи. HashMap не синхронизирован, но структура коллекции предоставляет методы, чтобы мы могли синхронизировать их если несколько потоков получат доступ к нашему хэшмапу, и один поток структурно изменит нашу карту.

Метод Открытый объект Object (Object Key, Object value) используется для добавления элемента в карту.

-1

HashMap является реализация интерфейса Map HashSet является реализация Set Interface

Hashmap хранит данные в виде пары ключей значение HashSet магазин только объекты

метод Put используется для добавления элемента в карте метод Add используется для добавления элемента устанавливается

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

HashMap быстрее HashSet, потому что уникальный ключ используется для доступа к объекту HashSet медленнее, чем Hashmap

+0

Они имеют практически идентичную производительность, а «потому что уникальный ключ используется» неверен. – EJP

33

HashSet

  1. HashSet класс реализует интерфейс Set
  2. В HashSet, мы храним объекты (элементы или значения) например Если у нас есть HashSet строковых элементов, он может отображать набор элементов HashSet: {«Привет», «Привет», «Пока», «Выполнить»}
  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 используется для хранения ключа & пары значений. Короче говоря, он поддерживает отображения ключа & значения (Класс HashMap примерно эквивалентен Hashtable, за исключением того, что он не синхронизирован и позволяет аннулирует.) Это , как вы могли бы представить HashMap элементы, если он имеет целочисленный ключ и значения типа String: например {1 -> «Привет», 2 -> «Привет», 3 -> «Bye», 4 -> «Выполнить»}
  3. HashMap не позволяет дублировать ключи, однако он позволяет иметь повторяющиеся значения.
  4. HashMap допускает одиночный нулевой ключ и любое количество нулевых значений.
  5. HashMap не синхронизируется означает, что они не подходят для поточно-операций, пока, если не синхронизирован явным образом. [Сходство]

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

Пожалуйста, обратитесь this article найти более подробную информацию.

0

HashMap является Map реализация, что позволяет повторяющиеся значения но не дублировать ключи.. Для добавления объекта требуется пара ключей/значений. Разрешены значения Null Keys и Null. например:

{в-> 3, миро-> 5, IS-> 2, nice-> 4}

HashSet является реализация Set, которая делает не допускает дубликатов .Если вы пытались добавить дублированный объект, вызов метода public boolean add(Object o), тогда набор остается неизменным и возвращает false. например:

[, мир, есть хороший]

1

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

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

, где его помещение объекта в карту в качестве ключа и значения является конечным объектом, которым является ПРЕДЫДУЩИЙ, который является манекеном.

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

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

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

0

Hashset Internally реализует HashMap. Если вы видите внутреннюю реализацию по адресу http://javaconceptoftheday.com/how-hashset-works-internally-in-java/, значения, вставленные в HashSet, сохраняются как ключи в HashMap, а это значение является объектом Dummy класса Object. Разница между HashMap и HashSet: - 1. HashMap содержит пары значений ключа, и к каждому значению можно обращаться по ключу, где по мере того, как HashSet нужно повторять каждый раз, когда нет метода get. 2. HashSet реализует интерфейс карты и допускает одно значение null как ключевое и несколько нулевых значений в качестве значений. Если HashSet реализует интерфейс Set, допускает только одно нулевое значение и не дублирует значения. (Повторите один нулевой ключ в ключе HashMap, следовательно, одно значение null в HashSet, так как HashSet реализует HashMap внутренне). 3.HashSet и HashMap не поддерживают порядок вставки во время итерации.

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