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

9voto

mreaevnia Punkte 508

Wenn Sie einen zugewiesenen Wert der Zeichenkette, d.h. eine primitive Zeichenkette, vergleichen wollen, funktionieren sowohl "==" als auch .equals, aber für das neue Zeichenkettenobjekt sollten Sie nur .equals verwenden, und hier funktioniert "==" nicht.

String a = "name";

String b = "name";

if(a == b) und (a.equals(b)) wird true zurückgegeben.

Aber

String a = new String("a");

In diesem Fall if(a == b) wird zurückgegeben false

Es ist also besser, die .equals Betreiber...

8voto

Abhinav Jayaram Punkte 156

Im Allgemeinen .equals wird verwendet für Object Vergleich, bei dem Sie überprüfen wollen, ob zwei Objects einen identischen Wert haben.

== für den Referenzvergleich (sind die beiden Objects derselbe Object auf dem Heap) & zu prüfen, ob die Object ist null. Sie wird auch verwendet, um die Werte von primitiven Typen zu vergleichen.

8voto

Himanshu Mohta Punkte 1003

== Operator vergleicht die Referenz eines Objekts in Java. Sie können Strings equals Methode.

String s = "Test";
if(s.equals("Test"))
{
    System.out.println("Equal");
}

6voto

tinker_fairy Punkte 1315

@Melkhiah66 Sie können die Methode "equals" anstelle der Methode "==" verwenden, um die Gleichheit zu prüfen. Wenn Sie intern() verwenden, wird geprüft, ob das Objekt im Pool vorhanden ist, und wenn ja, wird gleich, sonst ungleich. Die Methode equals verwendet intern einen Hashcode und liefert das gewünschte Ergebnis.

public class Demo { public static void main(String[] args) { String str1 = "Jorman 14988611"; String str2 = new StringBuffer("Jorman").append(" 14988611").toString(); String str3 = str2.intern(); System.out.println("str1 == str2 " + (str1 == str2)); //gives false System.out.println("str1 == str3 " + (str1 == str3)); //gives true System.out.println("str1 equals str2 " + (str1.equals(str2))); //gives true System.out.println("str1 equals str3 " + (str1.equals(str3))); //gives true } }

6voto

Raekye Punkte 4923

Ich weiß, dass dies eine alte Frage ist, aber ich sehe das folgendermaßen (ich finde es sehr nützlich):


Technische Erläuterungen

In Java sind alle Variablen entweder primitive Typen o Referenzen .

(Wenn Sie wissen wollen, was eine Referenz ist: "Objektvariablen" sind einfach Zeigern auf Objekte. Also mit Object something = ... etwas ist in Wirklichkeit eine Adresse im Speicher (eine Zahl)).

== vergleicht die genauen Werte. Es wird also verglichen, ob die primitiven Werte gleich sind, oder ob die Referenzen (Adressen) gleich sind. Deshalb ist == funktioniert oft nicht bei Strings; Strings sind Objekte, und die == auf zwei String-Variablen vergleicht nur, ob die Adresse im Speicher die gleiche ist, wie andere bereits erwähnt haben. .equals() ruft die Vergleichsmethode von Objekten auf, die die tatsächlichen Objekte vergleicht, auf die die Verweise zeigen. Im Fall von Strings wird jedes Zeichen verglichen, um festzustellen, ob sie gleich sind.


Der interessante Teil :

Warum also == manchmal true für Strings zurückgeben? Beachten Sie, dass Strings unveränderlich sind. In Ihrem Code, wenn Sie

String foo = "hi";
String bar = "hi";

Da Zeichenketten unveränderlich sind (wenn Sie die .trim() oder etwas anderes, wird eine neue Zeichenkette erzeugt, ohne das ursprüngliche Objekt, auf das im Speicher verwiesen wird, zu verändern), brauchen Sie nicht wirklich zwei verschiedene String("hi") Objekte. Wenn der Compiler schlau ist, wird der Bytecode so gelesen, dass er nur ein String("hi") Objekt. Wenn Sie also

if (foo == bar) ...

gleich danach, zeigen sie auf dasselbe Objekt und geben true zurück. Aber das ist selten Ihre Absicht. Stattdessen fragen Sie nach Benutzereingaben, die neue Zeichenfolgen an verschiedenen Stellen des Speichers erstellen, usw. usw.

Hinweis : Wenn Sie etwas tun wie baz = new String(bar) kann der Compiler immer noch herausfinden, dass es sich um dasselbe handelt. Aber der wichtigste Punkt ist, wenn der Compiler sieht literalen Zeichenfolgen, kann es leicht optimieren gleichen Zeichenfolgen.

Ich weiß nicht, wie es zur Laufzeit funktioniert, aber ich gehe davon aus, dass die JVM keine Liste von "Live-Strings" führt und prüft, ob eine gleiche Zeichenkette existiert. (z.B. wenn eine Eingabezeile zweimal gelesen wird und der Benutzer zweimal dieselbe Eingabe eingibt, wird nicht geprüft, ob die zweite Eingabezeichenkette dieselbe ist wie die erste, und sie werden in denselben Speicher geleitet). Es würde ein bisschen Heap-Speicher sparen, aber der Overhead ist so vernachlässigbar, dass es sich nicht lohnt. Nochmals, der Punkt ist, dass es für den Compiler einfach ist, literale Zeichenketten zu optimieren.

Da haben Sie es... eine düstere Erklärung für == vs. .equals() und warum es zufällig erscheint.

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