web-dev-qa-db-fra.com

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

Les parties de chaîne sont des chaînes [6]:

 ["231", "CA-California", "Sacramento-155328", "aleee", "Customer Service Clerk", "Alegra Keith.doc.txt"] 

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

"231" == parts[0]

le résultat ci-dessus est faux,

Je suis confus, alors quelqu'un pourrait-il me dire pourquoi?

44
omg

L'opérateur == Compare les références d'objet, pas la valeur des Strings.

Pour comparer les valeurs de Strings, utilisez la méthode String.equals :

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

Cela est vrai avec tout autre objet dans 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 de Object , et doit être remplacée par des classes qui seront comparées d'une manière ou d'une autre.

77
coobird

Si les chaînes ne sont pas internes, alors == vérifie l'identité de référence. Utilisation:

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

au lieu.

15
Yishai

== Dans Java compare l'adresse des objets (des chaînes dans ce cas).

Ce que vous voulez c'est parts[0].equals("231")

13
David Johnstone

Ce qui suit imprime "vrai";

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

En effet, les chaînes ne sont pas modifiables et Java essaiera d'économiser autant d'espace que possible, il pointe donc les deux vers la même référence de mémoire.

Cependant, ce qui suit affiche "faux":

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

new le forcera à stocker la chaîne dans un nouvel emplacement mémoire.

Soit dit en passant, vous devriez TOUJOURS utiliser .equals() pour comparer les chaînes (pour des cas comme celui-ci)

10
Jesse

Utilisez la méthode equals: parts [0] .equals ("231"). L'opérateur == compare les références d'objets.

7
tputkonen

"==" compare les références d'objet, dans votre cas "231" est un objet différent de parts [0].

Vous souhaitez utiliser String.equals .

parts[0].equals("231")
5
basszero

La réponse est très simple: lorsque vous comparez des chaînes via l'opérateur ==, vous comparez réellement si deux variables différentes se réfèrent à un seul objet String. Et ce n'est pas le cas, la chaîne dans le tableau et le "231" nouvellement créé sont des objets String 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 retournera vrai si ces objets String contiennent les mêmes valeurs.

4
Malcolm

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

public class String231Test extends TestCase {
    private String  a;
    private String  b;

    protected void setUp() throws Exception {
        a = "231";
        StringBuffer sb = new StringBuffer();
        sb.append("231");
        b = sb.toString();
    }

    public void testEquals() throws Exception {
        assertTrue(a.equals(b));
    }

    public void testIdentity() throws Exception {
        assertFalse(a == b);
    }
}
2
Carl Manaster

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

String str = "test";

if( str.compareTo("test") == 0)
   //the argument string is equal to str;
else
   //the argument string is not equal to str;
2
JCasso

Voici un bel exemple. L'opérateur '==' avec une chaîne peut être très délicat en Java.

class Foo {
    public static void main(String[] args) {
        String a = "hello";
        String b = "hello";
        String c = "h";
        c = c + "Ello";

        String 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");
    }
}

Ce qui produira la sortie suivante:

hello == hello
hello != hello
hello == hello
hello != hello
1
picca

Utilisez la méthode equals pour comparer des objets:

String[] 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.

1
Don Branson

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

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

parts[0].equals("blahblah")

Je préférerais une telle:

"blahblah".equals(parts[0])

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

Une autre façon utilise String.intern ():

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

Voir http://Java.Sun.com/j2se/1.4.2/docs/api/Java/lang/String.html#intern () pour plus d'informations à ce sujet.

0
Michael Zilbermann