Veuillez considérer le morceau de code ci-dessous:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
donnera 1 car HashSet
n'autorise pas les doublons, donc un seul élément sera stocké.
Je veux savoir si nous ajoutons l'élément dupliqué, alors remplace-t-il l'élément précédent ou ne l'ajoute tout simplement pas?
Aussi, que se passera-t-il HashMap
pour le même cas?
java
hashmap
duplicates
hashset
Anand
la source
la source
HashMap
pour voir s'ilkey
existe déjà avant de faire appelput
au supportmap
?Set
, et qui n'est jamais remplacé par l'put()
opération.Set
, mais je viens de me rendre compte queput()
cela ne remplacera que la valeur, pas la clé. Dans ce cas, c'est la même valeur mise à nouveau à côté de la clé, ce qui peut ou non être mieux que de vérifier si la clé existe et de mettre. De toute façon, je comprends comment cela fonctionne.HashSet
être implémenté sous la forme d'un fichierHashMap
. Difficile à savoir cependant, sauf si vous êtes l'un des développeurs des classes.La première chose que vous devez savoir est qu'il
HashSet
agit comme unSet
, ce qui signifie que vous ajoutez votre objet directement àHashSet
et qu'il ne peut pas contenir de doublons. Vous ajoutez simplement votre valeur directement dansHashSet
.Cependant,
HashMap
c'est unMap
type. Cela signifie que chaque fois que vous ajoutez une entrée, vous ajoutez une paire clé-valeur.Dans
HashMap
vous pouvez avoir des valeurs en double, mais pas des clés en double. DansHashMap
la nouvelle entrée remplacera l'ancienne. L'entrée la plus récente sera dans leHashMap
.Comprendre le lien entre HashMap et HashSet:
Rappelez-vous,
HashMap
ne peut pas avoir de clés en double. Derrière la scèneHashSet
utilise un fichierHashMap
.Lorsque vous essayez d'ajouter un objet dans un
HashSet
, cette entrée est en fait stockée en tant que clé dans leHashMap
- le mêmeHashMap
qui est utilisé derrière la scène deHashSet
. Étant donné que ce sous-jacent aHashMap
besoin d'une paire clé-valeur, une valeur fictive est générée pour nous.Maintenant, lorsque vous essayez d'insérer un autre objet dupliqué dans le même
HashSet
, il tentera à nouveau de l'insérer en tant que clé dans leHashMap
couché en dessous. Cependant,HashMap
ne prend pas en charge les doublons. Par conséquent,HashSet
il en résultera toujours une seule valeur de ce type. En remarque, pour chaque clé dupliquée, puisque la valeur générée pour notre entrée dans HashSet est une valeur aléatoire / factice, la clé n'est pas du tout remplacée. il sera ignoré car la suppression de la clé et l'ajout de la même clé (la valeur fictive est la même) n'aurait aucun sens.Résumé:
HashMap
autorise la duplicationvalues
, mais paskeys
.HashSet
ne peut pas contenir de doublons.Pour savoir si l'ajout d'un objet est terminé avec succès ou non, vous pouvez vérifier la
boolean
valeur renvoyée lorsque vous appelez.add()
et voir si elle renvoietrue
oufalse
. S'il est retournétrue
, il a été inséré.la source
HashMap allows duplicate values
HashMap remplace l'ancienne valeur par la nouvelle.La documentation est assez claire à ce sujet:
HashSet.add
ne remplace pas :Mais va remplacer:
HashMap.put
la source
C'est le cas de HashSet, il ne le remplace PAS.
À partir de la documentation:
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E )
"Ajoute l'élément spécifié à cet ensemble s'il n'est pas déjà présent. Plus formellement, ajoute l'élément spécifié e à cet ensemble si cet ensemble ne contient aucun élément e2 tel que (e == null? E2 == null: e.equals ( e2)). Si cet ensemble contient déjà l'élément, l'appel laisse l'ensemble inchangé et renvoie false. "
la source
Corrigez-moi si je me trompe, mais ce que vous voulez dire, c'est qu'avec des chaînes, "Salut" == "Salut" ne sort pas toujours vrai (car ils ne sont pas nécessairement le même objet).
La raison pour laquelle vous obtenez une réponse de 1 est cependant que la machine virtuelle Java réutilisera les objets chaînes lorsque cela est possible. Dans ce cas, la JVM réutilise l'objet de chaîne et écrase ainsi l'élément dans le Hashmap / Hashset.
Mais ce comportement n'est pas garanti (car il peut s'agir d'un objet chaîne différent ayant la même valeur "Hi"). Le comportement que vous voyez est simplement dû à l'optimisation de la JVM.
la source
Vous devez d'abord vérifier la méthode put dans Hash map car HashSet est sauvegardé par HashMap
la source
Pour le dire différemment: lorsque vous insérez une paire clé-valeur dans un HashMap où la clé existe déjà (dans un sens, hashvalue () donne la même valeur et equal () est vrai, mais les deux objets peuvent toujours différer de plusieurs manières ), la clé n'est pas remplacée mais la valeur est écrasée. La clé est juste utilisée pour obtenir la valeur de hachage () et trouver la valeur dans la table avec elle. Puisque HashSet utilise les clés d'un HashMap et définit des valeurs arbitraires qui n'ont pas vraiment d'importance (pour l'utilisateur), les éléments de l'ensemble ne sont pas remplacés non plus.
la source
HashMap
contient essentiellementEntry
ce qui contient par la suiteKey(Object)
et. EnValue(Object)
interneHashSet
sontHashMap
etHashMap
remplacent les valeurs comme certains d'entre vous l'ont déjà indiqué..mais cela remplace-t-il vraiment les clés ??? Non ... et c'est l'astuce ici.HashMap
conserve sa valeur comme clé dans le sous-jacentHashMap
et la valeur est juste un objet factice.Donc, si vous essayez de réinsérer la même valeur dans HashMap (clé dans la carte sous-jacente), elle remplace simplement la valeur factice et non la clé (valeur pour HashSet).Regardez le code ci-dessous pour la classe HashSet:
Ici, e est la valeur de HashSet mais la clé de la map sous-jacente et la clé n'est jamais remplacée. J'espère pouvoir dissiper la confusion.
la source