La différence entre == et égal m'a confondu pendant un certain temps jusqu'à ce que je décide de l'examiner de plus près. Beaucoup d'entre eux disent que pour comparer une chaîne, vous devez utiliser equals
et non ==
. J'espère que dans cette réponse je pourrai faire la différence.
La meilleure façon de répondre à cette question sera de vous poser quelques questions. Commençons donc:
Quelle est la sortie pour le programme ci-dessous:
String mango = "mango";
String mango2 = "mango";
System.out.println(mango != mango2);
System.out.println(mango == mango2);
si tu le dis,
false
true
Je dirai que vous avez raison, mais pourquoi avez-vous dit cela ? et si vous dites que la sortie est,
true
false
Je dirai que vous vous trompez mais je vous demanderai toujours pourquoi vous pensez que c'est vrai?
Ok, essayons de répondre à celui-ci:
Quelle est la sortie pour le programme ci-dessous:
String mango = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango3);
System.out.println(mango == mango3);
Maintenant, si vous dites,
false
true
Je dirai que tu as tort mais pourquoi est-ce mal maintenant ? la sortie correcte pour ce programme est
true
false
Veuillez comparer le programme ci-dessus et essayer d'y penser.
D'accord. Maintenant, cela pourrait aider (veuillez lire ceci: imprimer l'adresse de l'objet - pas possible mais nous pouvons toujours l'utiliser.)
String mango = "mango";
String mango2 = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(mango3 != mango2);
System.out.println(mango3 == mango2);
// mango2 = "mang";
System.out.println(mango+" "+ mango2);
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(System.identityHashCode(mango));
System.out.println(System.identityHashCode(mango2));
System.out.println(System.identityHashCode(mango3));
pouvez-vous juste essayer de penser à la sortie des trois dernières lignes dans le code ci-dessus: pour moi, ideone l'a imprimé ( vous pouvez vérifier le code ici ):
false
true
true
false
mango mango
false
true
17225372
17225372
5433634
Oh! Maintenant, vous voyez que l' identitéHashCode (mangue) est égale à l'identitéHashCode (mangue2) Mais ce n'est pas égal à l'identitéHashCode (mangue3)
Même si toutes les variables de chaîne - mango, mango2 et mango3 - ont la même valeur, qui est "mango", identityHashCode()
n'est pas toujours la même pour tous.
Maintenant, essayez de décommenter cette ligne // mango2 = "mang";
et de l'exécuter à nouveau cette fois, vous verrez que les trois identityHashCode()
sont différents. Hmm c'est un indice utile
nous savons que si hashcode(x)=N
et hashcode(y)=N
=>x is equal to y
Je ne sais pas comment Java fonctionne en interne, mais je suppose que c'est ce qui s'est passé lorsque j'ai dit:
mango = "mango";
java a créé une chaîne "mango"
qui a été pointée (référencée) par la variable mango
quelque chose comme ça
mango ----> "mango"
Maintenant dans la ligne suivante quand j'ai dit:
mango2 = "mango";
Il a en fait réutilisé la même chaîne "mango"
qui ressemble à ceci
mango ----> "mango" <---- mango2
La mangue et mango2 pointent vers la même référence. Maintenant, quand j'ai dit
mango3 = new String("mango")
Il a en fait créé une toute nouvelle référence (chaîne) pour "mangue". qui ressemble à ceci,
mango -----> "mango" <------ mango2
mango3 ------> "mango"
et c'est pourquoi quand je mets les valeurs pour mango == mango2
, ça mets true
. et quand je mets la valeur pour mango3 == mango2
, elle s'éteint false
(même lorsque les valeurs sont les mêmes).
et lorsque vous avez commenté la ligne, // mango2 = "mang";
cela a en fait créé une chaîne "mang" qui a transformé notre graphique comme ceci:
mango ---->"mango"
mango2 ----> "mang"
mango3 -----> "mango"
C'est pourquoi le IdentityHashCode n'est pas le même pour tous.
J'espère que cela vous aide les gars. En fait, je voulais générer un cas de test où == échoue et equals () réussit. N'hésitez pas à commenter et à me faire savoir si je me trompe.