Dupliquer des éléments dans java.util.Set
java.util.Set
implémentations supprime le doublon éléments.
Comment sont les doublons éléments supprimés en interne, dans un java.util.Set
??
source d'informationauteur Neo | 2009-10-29
Vous devez vous connecter pour publier un commentaire.
En fait autant que je sache, à partir des sources les plus
Set
implémentations en java ne sont même pas vérifier si l'élément est déjà contenue.Ils ont juste toujours exécuter le
add()
sur leur structure interne qui contient l'ensemble des éléments et laissez objet de gérer la duplication cas.par exemple
HashSet
appelsput(K,V)
sur l'interneHashMap
qui vient insère le nouvel objet d'écraser l'ancienne entrée si les doublons.Lecture un peu à votre question, je suppose que vous voyez un comportement étrange avec un
java.util.HashSet
(typiquement ce que tout le monde utilise par défaut).Contary le contrat de
java.util.Set
il est possible d'obtenir le même objet dans unjava.util.HashSet
deux fois comme ceci:Après le pointeur de la @de la gigue et un coup d'oeil à la source, vous pouvez voir pourquoi cela arriverait.
Comme @gigue dit, la
java.util.HashSet
utilise unjava.util.HashMap
en interne. Lorsque la valeur de hachage changements entre la première et la deuxième ajouter un autre seau est utilisé dans lejava.util.HashMap
et l'objet est dans l'ensemble deux fois.L'exemple de code peut sembler un peu contrieved mais j'ai vu cela se produire dans la nature avec des classes du domaine où le hachage est créé à partir de champs mutables et la méthode equals n'a pas été synchronisé avec ces champs.
Un moyen facile de le savoir est de regarder dans la source pour le code qui vous intéresse.
Chaque JDK a un src.zip inclus qui contient le code source pour le public des classes de sorte que vous pouvez simplement localiser la source pour HashSet et ont un look 🙂 j'ai souvent utiliser Eclipse pour cela. Commencer, créer un nouveau projet Java, jeu de la JVM pour être un JDK installé (si vous n'utilisez pas le système par défaut JRE qui n'ont pas l'src.zip), et Ctrl-Maj-T pour aller à HashSet.
Lire votre question plus détaillée:
Vous ne pouvez pas ajouter de doublons, de java doc pour les.ajouter() ou voulez-vous dire addAll?:
Ajoute l'élément spécifié à cet ensemble si elle n'est pas déjà présent (facultatif). Plus formellement, ajoute l'élément spécifié e pour cet ensemble si l'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. En combinaison avec la restriction sur les constructeurs, ce qui assure que les ensembles ne contiennent jamais de dupliquer des éléments.