Serait une Java HashSet<String>'s méthode contains() test d'égalité des chaînes de caractères ou de l'identité de l'objet?
Disons que j'ai ce code en Java:
HashSet<String> wordSet = new HashSet<String>();
String a = "hello";
String b = "hello";
wordSet.add(a);
Serait wordSet.contains(b);
retour true
ou false
? Ce que je comprends, a
et b
se référer à des objets différents, même si leurs valeurs sont les mêmes. Donc contains()
doit retourner false
. Cependant, lorsque j'exécute ce code, il retourne true
. Il va toujours revenir true
n'importe où de la Chaîne d'objet b
vient aussi longtemps que b
contient la valeur "hello"
? Suis-je assuré ce toujours? Si non, quand je ne suis pas garanti ce? Et si je voulais faire quelque chose de similaire avec des objets autres que des Chaînes de caractères?
Vous devez vous connecter pour publier un commentaire.
Il utilise
equals()
de comparer les données. Ci-dessous est à partir de la javadoc pour DéfinirLa
equals()
méthode pour la Chaîne ne une comparaison caractère par caractère. À partir de la javadoc de la ChaîneEn fait, HashSet ne ni.
Sa mise en œuvre utilise une table de hachage, et voici le code qui détermine si l'ensemble
contains()
(en fait, c'est à l'intérieur de HashMap est getEntry () (méthode):qui:
equals()
retourne trueLa réponse est "oui":
wordSet.contains(b)
retournera toujourstrue
HashSet<String>
. LeString
de la classehashCode
méthode renvoie des valeurs égales pour les deux chaînes pour lesquellesequals
est vrai. LeString
de la classeequals
méthode renvoie vrai si son argument est le même objet que l'objet pour lequel elle est appelée. Si la condition que vous avez cité est logiquement équivalent àequals()
.Fait, à la fois a et b font référence au même objet, parce que les littéraux de chaîne en Java sont automatiquement interné.
From what I understand, a and b refer to different objects even though their values are the same
- Im assez sûr que c'est pas ce qu'il en pensait.Deux choses:
Un ensemble serait assez inutile, sauf si elle a appelé la méthode equals() pour déterminer l'égalité. wordset.contient(b) renvoie vrai car un.equals(b) == true.
Vous ne pouvez pas être totalement sûr que a et b sont dirigés vers différents objets. La Caisse De La Chaîne.stagiaire() pour plus de détails.
En fin de compte
contains
va vérifier pourequals
méthode, plutôt que de son identifiant d'objet validation de la méthode contains. Doncequals
méthode sera appelée pourcontains
appel.C'est l'appel de la structure de
contains
méthode.HashSet
également laequals
méthode sera appelée pourcontains
L'égalité. Dans votre exemple,
contains()
retourne true, car le HashSet vérifiea.equals( b )
.