130 votes

L'ajout d'une valeur en double à un HashSet / HashMap remplace-t-il la valeur précédente

Veuillez considérer le code ci-dessous:

 HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
 

hs.size() donnera 1 comme HashSet n'autorise pas les doublons, donc un seul élément sera stocké.

Je veux savoir si nous ajoutons l'élément dupliqué, cela remplacera-t-il l'élément précédent ou ne l'a-t-il tout simplement pas ajouté?

En outre, que se passera-t-il en utilisant HashMap pour le même cas?

230voto

Keppil Points 28356

Dans le cas de HashMap , il remplace l'ancienne valeur par la nouvelle.

Dans le cas de HashSet , l'élément n'est pas inséré.

47voto

Jimmy Points 900

La première chose que vous devez savoir est ,HashSet agir comme un Set ce qui signifie que vous ajoutez votre objet directement à l' HashSet et il ne peut pas contenir de doublons. c'est à dire que Vous venez d'ajouter directement la valeur en HashSet.

Toutefois, HashMapest Map type, ce qui signifie que chaque fois que vous ajoutez un peu de l'entrée, vous ajoutez paire clé-valeur. En HashMap, vous pouvez avoir des valeurs en double, mais pas des doubles des clés. En HashMap, la nouvelle entrée remplacera l'ancien. ie récente entrée sera en HashMap

Comprendre le Lien entre la table de hachage et HashSet:

Rappelez-vous, HashMap ne peut pas avoir des doubles des clés. Maintenant , Derrière la scène, HashSet utilise HashMap. Lorsque vous essayez d'ajouter n'importe quel objet en HashSet, cette entrée est stockée comme clé dans l' HashMap,le même HashMap qui est utilisé derrière la scène de l' HashSet. Depuis , cette sous-jacent HashMap des besoins de paires clé-valeur,une valeur factice seront générés pour nous qui nous n'aurions pas d'avis ou ne serait pas de soins. Maintenant, lorsque vous essayez d'insérer un autre objet en double dans le même HashSet, il sera de nouveau tenté d'insérer la clé dans l' HashMap couché,cependant, HashMap ne prend pas en charge /contenir des doublons. Par conséquent, HashSet produira toujours avoir une seule valeur de ce type. Sur le côté de la note pour chaque double de la clé, puisque la valeur générée pour notre entrée dans HashSet est du hasard/valeur factice que nous n'aurions pas de soins, la clé n'est pas remplacé. il sera ignoré que le retrait de la clé et en rajoutant même clé ( la valeur est factice /même ) ne fera pas le moindre sens.

Résumé:

HashMap permet de dupliquer values, mais pas keys. HashSet ne contient en double.

Juste pour jouer avec si plus d'un objet est terminé avec succès ou pas , vous pouvez vérifier l' boolean de la valeur renvoyée lorsque vous appelez .add() et voir si elle renvoie true ou false, S'il est retourné true, il a été inséré .

19voto

pb2q Points 28514

Les docs sont assez clairs sur ce point: HashSet.add ne pas remplacer:

Ajoute l'élément spécifié à cet ensemble si elle n'est pas déjà présent. Plus formellement, ajoute l'élément spécifié e pour cet ensemble si cet ensemble ne contient aucun élément e2 telle que (f==null ? e2==null : e.equals(e2)). Si cet ensemble contient déjà un élément, l'appel des feuilles de l'ensemble inchangé et renvoie la valeur false.

Mais HashMap.put va remplacer:

Si la carte contenait auparavant une cartographie pour la clé, l'ancienne valeur est remplacé.

4voto

Bob Provencher Points 319

Le cas de HashSet, il ne les 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 si elle n'est pas déjà présent. Plus formellement, ajoute l'élément spécifié e pour cet ensemble si cet ensemble ne contient aucun élément e2 telle que (f==null ? e2==null : e.equals(e2)). Si cet ensemble contient déjà un élément, l'appel des feuilles de l'ensemble inchangé et renvoie la valeur false."

1voto

Nick Rippe Points 5529

Corrigez-moi si je me trompe, mais ce que vous obtenez est que avec des chaînes, "Hi" == "Salut" n'est 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 bien parce que la JVM de réutilisation des chaînes d'objets lorsque cela est possible. Dans ce cas, la JVM est la réutilisation de l'objet de type string, et donc l'écrasement de l'élément dans la table de hachage/Hashset.

Mais vous n'êtes pas garanti ce comportement, car il pourrait être un autre objet de type string qui a la même valeur "Salut"). Le comportement que vous voyez est juste à cause de la JVM de l'optimisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X