Différence entre HashSet et HashMap?

168

Hormis le fait que cela HashSetn'autorise pas les valeurs en double, quelle est la différence entre HashMapet HashSet?

Je veux dire en termes de mise en œuvre? C'est un peu vague car les deux utilisent des tables de hachage pour stocker des valeurs.

SpikETidE
la source
HashSet est implémenté en utilisant HashMap
therealprashant
Je pense que savoir pourquoi HashSet est différent de ArrayList vous aidera à comprendre la réponse à votre question ci-dessus: stackoverflow.com/questions/18706870
...

Réponses:

150

Ce sont des constructions entièrement différentes. A HashMapest une implémentation de Map. Une carte mappe les clés aux valeurs. La recherche de clé s'effectue à l'aide du hachage.

D'autre part, a HashSetest une implémentation de Set. UNE ensemble est conçu pour correspondre au modèle mathématique d'un ensemble. A HashSetutilise a HashMappour soutenir son implémentation, comme vous l'avez noté. Cependant, il implémente une interface entièrement différente.

Lorsque vous recherchez ce qui conviendra le mieux Collectionà vos besoins, ce didacticiel est un bon point de départ. Si vous voulez vraiment savoir ce qui se passe, il y a aussi un livre pour ça .

justkt
la source
Cette déclaration est un peu simpliste. Il y en a d'autres sous les couvertures. "" Renvoie une valeur de hachage pour l'objet spécifié. En plus du hashCode de l'objet, cette méthode applique une «fonction de hachage supplémentaire», qui se défend contre les fonctions de hachage de mauvaise qualité. Ceci est critique car HashMap utilise des tables de hachage de deux longueurs. " Weblogs.java.net/blog/2005/06/18/hashmap-implementation - cependant, si vous regardez le document, vous verrez que ce hachage distribue des choses sur "buckets", donc à la fin je crois que deux choses peuvent être mappées sur le même bucket.
justkt
1
Pour répondre à votre deuxième question - non. Une carte est si vous voulez (clé -> valeur) telle que définie par l'excellente réponse de @Bruno Rothgiesser. Un ensemble est destiné aux éléments non dupliqués. Si vous voulez des doublons et non une clé-> valeur, je vérifierais une implémentation java.util.List. Consultez le didacticiel de la collection pour un guide définitif: java.sun.com/docs/books/tutorial/collections/index.html
justkt
@justk: oui, vous pouvez obtenir deux clés dans un même compartiment, puis equals () est utilisé pour les distinguer. C'est pourquoi il est essentiel que hashCode () et equals () soient compatibles.
Michael Borgwardt
6
@SpikETidE: ni HashMap ni HashSet n'autorisent les doublons. Exactement.
Michael Borgwardt
23
@SpikETidE: un ensemble n'a pas de paires clé / valeur, seulement des éléments. Et HashSet est implémenté en ayant un HashMap avec les éléments définis comme clés et la valeur étant ignorée.
Michael Borgwardt
300

HashSet est un ensemble , par exemple {1,2,3,4,5}

HashMap est une carte clé -> valeur (clé à valeur), par exemple {a -> 1, b -> 2, c -> 2, d -> 1}

Notez dans mon exemple ci-dessus que dans le HashMap, il ne doit pas y avoir de clés en double, mais il peut avoir des valeurs en double.

Dans le HashSet, il ne doit y avoir aucun élément en double.

bouillon
la source
Mais la raison (la plus intéressante) de la confusion est que même dans HashSet, vous avez besoin d'une "clé" pour accéder aux éléments. C'est-à-dire que les objets, même en mathématiques, ont des noms (ou adresses), s'ils doivent être consultés ou référencés. Donc, dans ce sens réel, un HashSet est un HashMap particulièrement simple, avec les noms (ou adresses) de ses éléments.
Andrew Marshall
65

HashSet

  1. La classe HashSet implémente l'interface Set
  2. Dans HashSet, nous stockons des objets (éléments ou valeurs) par exemple, si nous avons un HashSet d'éléments de chaîne, il pourrait représenter un ensemble d'éléments HashSet: {"Hello", "Hi", "Bye", "Run"}
  3. HashSet n'autorise pas les éléments en double, ce qui signifie que vous ne pouvez pas stocker de valeurs en double dans HashSet.
  4. HashSet permet d'avoir une seule valeur nulle.
  5. HashSet n'est pas synchronisé, ce qui signifie qu'il ne convient pas aux opérations thread-safe tant qu'il n'est pas synchronisé explicitement. [Similarité]

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

HashMap

  1. La classe HashMap implémente l'interface Map
  2. HashMap est utilisé pour stocker les paires clé et valeur. En bref, il maintient le mappage de la clé et de la valeur (la classe HashMap est à peu près équivalente à Hashtable, sauf qu'elle est non synchronisée et autorise les valeurs nulles.) Voici comment vous pouvez représenter les éléments HashMap si elle a une clé entière et une valeur de type String: par exemple {1 -> "Bonjour", 2 -> "Salut", 3 -> "Au revoir", 4 -> "Exécuter"}
  3. HashMap n'autorise pas les clés en double mais il permet d'avoir des valeurs en double.
  4. HashMap autorise une seule clé nulle et n'importe quel nombre de valeurs nulles.
  5. HashMap n'est pas synchronisé, ce qui signifie qu'il ne convient pas aux opérations thread-safe tant qu'il n'est pas synchronisé explicitement. [Similarité]

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

Veuillez consulter cet article pour obtenir plus d'informations.

Avanish Kumar
la source
36

C'est vraiment dommage que leurs deux noms commencent par Hash . C'est la partie la moins importante d'entre eux. Les parties importantes viennent après le Hash - l' ensemble et la carte , comme d'autres l'ont souligné. Ce qu'ils sont, respectivement, sont un ensemble - une collection non ordonnée - et une carte - une collection avec un accès par clé. Ils sont implémentés avec des hachages - c'est de là que viennent les noms - mais leur essence est cachée derrière cette partie de leurs noms.

Ne soyez pas confus par leurs noms; ce sont des choses profondément différentes.

Carl Manaster
la source
@HiteshSahu Ils sont tous deux implémentés avec des tables de hachage ( en.wikipedia.org/wiki/Hash_table ). C'est une bonne structure de données pour représenter un ensemble, efficace de la bonne manière, et, essentiellement, les clés d'un HashMap sont implémentées comme un HashSet. Ainsi, celui qui les a nommés s'est donné du mal pour les mettre en œuvre et s'est concentré sur la mise en œuvre plutôt que sur leur objectif (à une supposition).
Carl Manaster
1
Bien expliqué. Je vous remercie.
user3932000
5

Les Hashsetimplémente en interne HashMap. Si vous voyez l' implémentation interne, les valeurs insérées dans HashSet sont stockées sous forme de clés dans HashMap et la valeur est un objet factice de la classe Object.
La différence entre HashMap et HashSet est: -

  1. HashMap contient des paires clé / valeur et chaque valeur est accessible par clé alors que HashSet doit être réitéré à chaque fois car il n'y a pas de méthode get.
  2. HashMapimplémente l'interface Map et autorise une valeur nulle en tant que clé et plusieurs valeurs nulles en tant que valeurs.Lorsque HashSetimplémente l'interface Set, n'autorise qu'une seule valeur nulle et aucune valeur dupliquée. car HashSet implémente HashMap en interne).
  3. HashSetet HashMapne conserve pas l'ordre d'insertion lors de l'itération.
Abhay S
la source
3

HashSet nous permet de stocker des objets dans l'ensemble alors que HashMap nous permet de stocker des objets sur la base de la clé et de la valeur. Chaque objet ou objet stocké aura la clé.

Spidfire
la source
2

Comme son nom l'indique, un HashMap est une Map associative (mappage d'une clé à une valeur), un HashSet n'est qu'un Set .

Leonbloy
la source
2
@SpikETidE C'est un détail de la façon dont l'unicité est implémentée, mais la signification de HashSet est d'implémenter un ensemble.
Michael Borgwardt
1
donc .. tout se résume à "si vous ne voulez pas de doublons, utilisez hashSet ... Si vous ne vous souciez pas des doublons, utilisez HashMap" ....?
SpikETidE
3
Java n'implémente pas de classe spécifique pour une "collection avec des éléments potentiellement dupliqués" (un "sac"), vous pouvez utiliser une liste pour cela (bien qu'une liste ajoute un peu de sémantique au sac: order; mais vous pouvez l'ignorer).
leonbloy
2

Différences entre HashSet et HashMap en Java

1) première et la plus importante différence entre HashMap et HashSet est que HashMap est une implémentation de l'interface Map tandis que HashSet est une implémentation de l'interface Set, ce qui signifie que HashMap est une structure de données basée sur des valeurs clés et HashSet garantit l'unicité en n'autorisant pas les doublons. reality HashSet est un wrapper autour de HashMap en Java, si vous regardez le code de la méthode add (E e) de HashSet.java, vous verrez le code suivant:

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

où sa mise Object dans la carte comme clé et valeur est un objet final PRESENT qui est factice.

2) La deuxième différence entre HashMap et HashSet est que nous utilisons la méthode add () pour placer des éléments dans Set mais nous utilisons la méthode put () pour insérer la clé et la valeur dans HashMap en Java.

3) HashSet autorise une seule clé nulle, mais HashMap peut autoriser une clé nulle + plusieurs valeurs nulles.

Tout est sur la différence entre HashSet et HashMap en Java. En résumé, HashSet et HashMap sont deux types différents de Collection, l'un étant Set et l'autre étant Map.

Vibha Sanskrityayan
la source
2

Différences entre HashSet et HashMap en Java

HashSet utilise en interne HashMap pour stocker des objets.Lorsque la méthode add (String) appelée, elle appelle la méthode HahsMap put (key, value) où key = String object & value = new Object (Dummy) .de sorte qu'il ne conserve aucun doublon car les clés ne sont rien d'autre que Value Objet.

les objets qui sont stockés comme clé dans Hashset / HashMap doivent remplacer hashcode & equals contract.

Les clés qui sont utilisées pour accéder / stocker des objets de valeur dans HashMap doivent être déclarées comme finales car, lorsqu'elles sont modifiées, l'objet de valeur ne peut pas être localisé et renvoie null.

user3539704
la source
1

A HashMapconsiste à ajouter, récupérer, supprimer, ... des objets indexés par une clé personnalisée de n'importe quel type.
UNEHashSet consiste à ajouter des éléments, supprimer des éléments et vérifier si des éléments sont présents en comparant leurs hachages.

Ainsi, un HashMap contient les éléments et un HashSet se souvient de leurs hachages.

Martijn Courteaux
la source
1
En comparant leurs hachages et en appelant leurs equals()méthodes.
Marquis of Lorne
1

Différences: par rapport à l'hérarchie: HashSet implémente Set. HashMap implémente Map et stocke un mappage de clés et de valeurs.

Une utilisation de HashSet et HashMap par rapport à la base de données vous aiderait à comprendre la signification de chacun.
HashSet: est généralement utilisé pour stocker des objets de collection uniques. Par exemple: il peut être utilisé comme classe d'implémentation pour stocker une relation plusieurs-à-un entre la
classe Item et la classe Bid où (Item has many Bids ) HashMap: est utilisé pour mapper une clé à une valeur.la valeur peut être nulle ou n'importe quel objet / liste d'objets (qui est un objet en soi).

poulie sans friction
la source
0

Un HashSet est implémenté en termes de HashMap . C'est un mappage entre la clé et un objet PRESENT.

Matthew Flaschen
la source
5
Qu'est-ce qu'un «objet PRESENT»?
Marquis of Lorne
0

Un HashSet utilise un HashMap en interne pour stocker ses entrées. Chaque entrée du HashMap interne est saisie par un seul objet, de sorte que toutes les entrées sont hachées dans le même compartiment. Je ne me souviens pas de ce que le HashMap interne utilise pour stocker ses valeurs, mais cela n'a pas vraiment d'importance puisque ce conteneur interne ne contiendra jamais de valeurs en double.

EDIT : Pour répondre au commentaire de Matthew, il a raison; Je l'ai eu à l'envers. Le HashMap interne est indexé avec les objets qui composent les éléments Set . Les valeurs de HashMap sont un objet qui est simplement stocké dans les buckets HashMap.

Andy Gherna
la source
Ce n'est pas juste. Les éléments définis sont directement utilisés comme clés HashMap.
Matthew Flaschen
0

HashMapest une Mapimplémentation, permettant des valeurs en double mais pas des clés en double. . Pour ajouter un objet, une paire clé / valeur est requise. Les clés nulles et les valeurs nulles sont autorisées. par exemple:

{The-> 3, world-> 5, is-> 2, nice-> 4}

HashSetest une Setimplémentation, qui n'autorise pas les doublons . Si vous avez essayé d'ajouter un objet dupliqué, un appel à la public boolean add(Object o)méthode, alors l'ensemble reste inchangé et retourne false. par exemple:

[Le, monde, est, joli]

Minnie
la source
-1

vous avez à peu près répondu à votre propre question - hashset n'autorise pas les valeurs en double. il serait trivial de construire un hashset en utilisant un hashmap de sauvegarde (et juste une vérification pour voir si la valeur existe déjà). Je suppose que les différentes implémentations java le font ou implémentent du code personnalisé pour le faire plus efficacement.

Chris
la source
1
@oedo - java.util.HashSetdit que c'est soutenu par un java.util.HashMap.
justkt
2
Ne pas autoriser les doublons n'est pas une différence entre eux.
Marquis of Lorne
-1

Fondamentalement, dans HashMap, l'utilisateur doit fournir à la fois la clé et la valeur, tandis que dans HashSet, vous ne fournissez que la valeur, la clé est dérivée automatiquement de la valeur à l'aide de la fonction de hachage. Ainsi, après avoir à la fois la clé et la valeur, HashSet peut être stocké en tant que HashMap en interne.

Munish Goyal
la source
La clé est la valeur d'un HashSet.
Marquis of Lorne
-1

HashSet et HashMap stockent tous les deux des paires, la différence réside dans le fait que dans HashMap, vous pouvez spécifier une clé tandis que dans HashSet, la clé provient du code de hachage de l'objet

prateeksarda
la source
Si c'était vrai, HashSet ne pouvait pas stocker plusieurs objets avec le même hashCode, et c'est le cas.
Marquis of Lorne
-1

HashMapsautorise une clé nulle et des valeurs nulles. Ils ne sont pas synchronisés, ce qui augmente l'efficacité. Si nécessaire, vous pouvez les synchroniser en utilisantCollections.SynchronizedMap()

Hashtables n'autorisent pas les clés nulles et sont synchronisées.

Appesh
la source
Il n'a pas demandé à Hashtables. Ne répond pas à la question.
Marquis of Lorne
-2

HashMap est une implémentation de l'interface de carte HashSet est une implémentation de Set Interface

HashMap Stocke les données sous forme de paire clé / valeur HashSet Stocke uniquement des objets

La méthode Put est utilisée pour ajouter un élément dans la carte La méthode Add est utilisée pour ajouter l'élément est Set

Dans la carte de hachage, la valeur de hashcode est calculée à l'aide de l'objet clé Ici, l'objet membre est utilisé pour calculer la valeur de hashcode qui peut être la même pour deux objets, donc la méthode equal () est utilisée pour vérifier l'égalité si elle renvoie false, ce qui signifie que deux objets sont différents.

HashMap est plus rapide que hashset car une clé unique est utilisée pour accéder à l'objet HashSet est plus lent que Hashmap

Hengameh
la source
1
Ils ont des performances essentiellement identiques et «parce qu'une clé unique est utilisée» est incorrect.
Marquis of Lorne le