La comparaison Java avec == de deux chaînes est fausse?

Les parties de chaîne sont Ssortingng [6]:

 ["231", "CA-California", "Sacramento-155328", "aleee", "commis au service à la clientèle", "Alegra Keith.doc.txt"]

Mais quand je compare des parts[0] avec "231" :

 "231" == parts[0] 

le résultat ci-dessus est faux,

Je suis confus, alors est-ce que quelqu’un pourrait me dire pourquoi?

L’opérateur == compare les références d’object, pas la valeur de Ssortingng s.

Pour comparer les valeurs de Ssortingng s, utilisez la méthode Ssortingng.equals :

 "231".equals(parts[0]); 

Cela est vrai pour tout autre object en Java – lors de la comparaison de valeurs, utilisez toujours la méthode equals plutôt que d’utiliser l’opérateur == .

La méthode equals fait partie d’ Object et doit être remplacée par des classes qui seront comparées d’une manière ou d’une autre.

Si les chaînes ne sont pas internées, == vérifie l’identité de référence. Utilisation:

  "231".equals(parts[0]); 

au lieu.

== en Java compare l’adresse des objects (chaînes dans ce cas).

Ce que vous voulez, ce sont des parts[0].equals("231")

Ce qui suit imprime “true”;

 Ssortingng s = "231"; if(s == "231") { System.out.println("true"); } else { System.out.println("false"); } 

En effet, les chaînes de caractères ne sont pas mutables et Java essaye d’économiser autant d’espace que possible, de sorte qu’il pointe vers la même référence de mémoire.

Toutefois, les éléments suivants sont “false”:

 Ssortingng s = new Ssortingng("231"); if(s == "231") { System.out.println("true"); } else { System.out.println("false"); } 

new l’obligera à stocker la chaîne dans un nouvel emplacement mémoire.

Au fait, vous devez TOUJOURS utiliser .equals() pour comparer les chaînes (pour les cas comme celui-ci)

Utilisez la méthode equals: parts [0] .equals (“231”). L’opérateur == compare les références aux objects.

“==” compare les références aux objects, dans votre cas, “231” est un object différent des parties [0].

Vous voulez utiliser Ssortingng.equals .

 parts[0].equals("231") 

La réponse est très simple: lorsque vous comparez des chaînes via l’opérateur ==, vous comparez en réalité si deux variables différentes font référence à un seul object Ssortingng. Et ils ne le font pas, la chaîne dans le tableau et nouvellement créé “231” sont des objects Ssortingng différents avec le même contenu.

La bonne chose à faire est d’utiliser l’expression suivante: "231".equals(parts[0]) ou "231".equalsIgnoreCase(parts[0]) . Cela vous donnera ce dont vous avez besoin et renvoie true si ces objects Ssortingng contiennent les mêmes valeurs.

J’ai pensé qu’il pourrait être utile d’exprimer la réponse dans un cas de test:

 public class Ssortingng231Test extends TestCase { private Ssortingng a; private Ssortingng b; protected void setUp() throws Exception { a = "231"; SsortingngBuffer sb = new SsortingngBuffer(); sb.append("231"); b = sb.toSsortingng(); } public void testEquals() throws Exception { assertTrue(a.equals(b)); } public void testIdentity() throws Exception { assertFalse(a == b); } } 

Vous pouvez également utiliser la méthode compareTo (Ssortingng) :

 Ssortingng str = "test"; if( str.compareTo("test") == 0) //the argument ssortingng is equal to str; else //the argument ssortingng is not equal to str; 

Utilisez la méthode equals pour comparer des objects:

 Ssortingng[] test = {"231", "CA-California", "Sacramento-155328", "aleee", "Customer Service Clerk", "Alegra Keith.doc.txt"}; System.out.println("231".equals(test[0])); 

La comparaison ‘==’ compare les références, pas les valeurs.

Voici un très bel exemple. L’opérateur ‘==’ avec une chaîne peut être très compliqué en Java.

 class Foo { public static void main(Ssortingng[] args) { Ssortingng a = "hello"; Ssortingng b = "hello"; Ssortingng c = "h"; c = c + "ello"; Ssortingng operator = null; if(a == b) { operator = " == "; } else { operator = " != "; } System.out.println(a + operator + b); if(a == c) { operator = " == "; } else { operator = " != "; } System.out.println(a + operator + c); if(a == "hello") { operator = " == "; } else { operator = " != "; } System.out.println(a + operator + "hello"); if(c == "hello") { operator = " == "; } else { operator = " != "; } System.out.println(c + operator + "hello"); } } 

Qui produira la sortie suivante:

 hello == hello hello != hello hello == hello hello != hello 

Comme beaucoup d’autres l’ont déjà expliqué, vous essayez de comparer avec l’opérateur d’égalité, mais il s’appuiera sur Object.equals () au lieu de Ssortingng.equals ().

Vous pouvez donc faire le travail en appelant explicitement Ssortingng.equals (), mais au lieu d’écrire

 parts[0].equals("blahblah") 

Je préférerais tel:

 "blahblah".equals(parts[0]) 

Comme cela évite de tester la nullité potentielle des parties [0] (mais faites attention à ce que la variable partie elle-même puisse être nulle …)

Une autre méthode consiste à utiliser Ssortingng.intern ():

 if (parts[0].intern() == "blahblah") ... 

Voir http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Ssortingng.html#intern () pour plus d’informations à ce sujet.