589 Stimmen

String.equals versus ==

Dieser Code trennt eine Zeichenkette in Token und speichert sie in einem Array von Zeichenketten, und vergleicht dann eine Variable mit dem ersten Home ... warum funktioniert es nicht?

public static void main(String...aArguments) throws IOException {

    String usuario = "Jorman";
    String password = "14988611";

    String strDatos = "Jorman 14988611";
    StringTokenizer tokens = new StringTokenizer(strDatos, " ");
    int nDatos = tokens.countTokens();
    String[] datos = new String[nDatos];
    int i = 0;

    while (tokens.hasMoreTokens()) {
        String str = tokens.nextToken();
        datos[i] = str;
        i++;
    }

    //System.out.println (usuario);

    if ((datos[0] == usuario)) {
        System.out.println("WORKING");
    }
}

609voto

Alnitak Punkte 324207

Verwenden Sie die string.equals(Object other) Funktion zum Vergleich von Zeichenketten, nicht die == Betreiber.

Die Funktion prüft den tatsächlichen Inhalt der Zeichenkette, die == Operator prüft, ob die Verweise auf die Objekte gleich sind. Beachten Sie, dass String-Konstanten in der Regel "interniert" sind, so dass zwei Konstanten mit dem gleichen Wert tatsächlich verglichen werden können mit == aber es ist besser, sich nicht darauf zu verlassen.

if (usuario.equals(datos[0])) {
    ...
}

NB: Der Vergleich wird mit 'usuario' durchgeführt, weil das in Ihrem Code garantiert nicht null ist, obwohl Sie trotzdem überprüfen sollten, ob Sie tatsächlich einige Token in der datos Array, sonst erhalten Sie eine Array-out-of-bounds-Ausnahme.

592voto

Jops Punkte 21946

Treffen Sie Jorman

Jorman ist ein erfolgreicher Geschäftsmann und besitzt 2 Häuser.

enter image description here

Aber andere wissen das nicht.

Ist es derselbe Jorman?

Wenn man Nachbarn aus der Madison oder Burke Street fragt, ist dies das Einzige, was sie sagen können:

enter image description here

Allein anhand des Wohnsitzes ist es schwer zu bestätigen, dass es sich um denselben Jorman handelt. Da es sich um 2 verschiedene Adressen handelt, liegt die Vermutung nahe, dass es sich um 2 verschiedene Personen handelt.

Auf diese Weise kann der Betreiber == verhält. Es wird also heißen datos[0]==usuario ist falsch, weil sie nur vergleicht die Adressen .

Ein Ermittler als Retter in der Not

Was wäre, wenn wir einen Ermittler schicken würden? Wir wissen, dass es derselbe Jorman ist, aber wir müssen es beweisen. Unser Detektiv wird sich alle physischen Aspekte genau ansehen. Nach einer gründlichen Untersuchung wird er in der Lage sein, festzustellen, ob es sich um dieselbe Person handelt oder nicht. Lassen Sie es uns in Java sehen.

Hier ist der Quellcode von Strings equals() Methode:

enter image description here

Es vergleicht die Strings Zeichen für Zeichen, um zu dem Schluss zu kommen, dass sie tatsächlich gleich sind.

So wird der String equals Methode verhält. Also datos[0].equals(usuario) wird true zurückgeben, weil es eine logischer Vergleich .

104voto

Michal Bernhard Punkte 3804

Es ist gut zu wissen, dass in einigen Fällen kann die Verwendung des Operators "==" zum erwarteten Ergebnis führen, da Java Strings wie folgt behandelt - String-Literale interniert sind (siehe String.intern() ) während der Kompilierung - wenn Sie also zum Beispiel schreiben "hello world" in zwei Klassen und vergleichen Sie diese Zeichenketten mit "==", so erhalten Sie das Ergebnis: wahr, was nach Spezifikation wenn Sie gleiche Zeichenketten vergleichen (wenn sie den gleichen Wert haben), wenn die erste Zeichenkette ein String-Literal ist (d.h. definiert durch "i am string literal" ) und die zweite wird während der Laufzeit konstruiert, d.h. mit dem Schlüsselwort "new" wie new String("i am string literal") le == (Gleichheitsoperator) gibt false zurück, weil beide unterschiedliche Instanzen des String Klasse.

Der einzig richtige Weg ist die Verwendung von .equals() -> datos[0].equals(usuario) . == sagt nur, wenn zwei Objekte dieselbe Instanz eines Objekts sind (d. h. dieselbe Speicheradresse haben)

Update : 01.04.2013 Ich habe diesen Beitrag aufgrund der Kommentare unten aktualisiert, die irgendwie richtig sind. Ursprünglich habe ich erklärt, dass interning (String.intern) ist Nebeneffekt der JVM-Optimierung. Obwohl es sicherlich Speicherressourcen sparen (das war, was ich mit "Optimierung" gemeint) ist es vor allem Funktion der Sprache

38voto

HariShankar Punkte 809

equals() Funktion ist eine Methode der Object Klasse, die vom Programmierer außer Kraft gesetzt werden sollte. String Klasse überschreibt sie, um zu prüfen, ob zwei Strings gleich sind, d.h. im Inhalt und nicht in der Referenz.

== Operator prüft, ob die Referenzen der beiden Objekte gleich sind.

Berücksichtigen Sie die Programme

String abc = "Awesome" ;
String xyz =  abc;

if(abc == xyz)
     System.out.println("Refers to same string");

Hier wird die abc y xyz , beide beziehen sich auf dasselbe String "Awesome" . Daraus ergibt sich der Ausdruck (abc == xyz) es true .

String abc = "Hello World";
String xyz = "Hello World";

if(abc == xyz)
    System.out.println("Refers to same string");
else
    System.out.println("Refers to different strings");

if(abc.equals(xyz))
     System.out.prinln("Contents of both strings are same");
else
     System.out.prinln("Contents of strings are different");

Hier abc y xyz sind zwei verschiedene Zeichenfolgen mit demselben Inhalt "Hello World" . Daher ist hier der Ausdruck (abc == xyz) es false wobei als (abc.equals(xyz)) es true .

Ich hoffe, Sie haben den Unterschied zwischen == y <Object>.equals()

Danke.

38voto

Aniket Thakur Punkte 62911
The == operator checks if the two references point to the same object or not.
.equals() checks for the actual string content (value).

Beachten Sie, dass die Methode .equals() zur Klasse Object (Oberklasse aller Klassen) gehört. Sie müssen sie je nach Ihren Klassenanforderungen überschreiben, aber für String ist sie bereits implementiert und prüft, ob zwei Strings den gleichen Wert haben oder nicht.

Case1)
String s1 = "Stack Overflow";
String s2 = "Stack Overflow";
s1 == s1;      // true
s1.equals(s2); // true
Reason: String literals created without null are stored in the string pool in the permgen area of the heap. So both s1 and s2 point to the same object in the pool.
Case2)
String s1 = new String("Stack Overflow");
String s2 = new String("Stack Overflow");
s1 == s2;      // false
s1.equals(s2); // true
Reason: If you create a String object using the `new` keyword a separate space is allocated to it on the heap.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X