2010-12-09 13 views
3
String a = new String ("TEST"); 
String b = new String ("TEST"); 

if(a == b) { 
    System.out.println ("TRUE"); 
} else { 
System.out.println ("FALSE"); 
} 

Ich habe es versucht und es FALSE gedruckt, möchte ich den Grund genau wissen.Ein Interview Frage in Java

Vielen Dank im Voraus.

+2

Was denkst du ist es? (Tipp: Nimm einen Texteditor und einen Compiler und finde es heraus) – OscarRyz

+0

@@ OscarRyz: Ich will den Grund genau wissen. Deshalb habe ich hier – Fero

+2

Dann fragen Sie: * "Ich bekomme das aber ich dachte, ich würde das bekommen ... warum ist es etc. etc" * – OscarRyz

Antwort

14

Es druckt FALSE.

== Der Operator vergleicht Objektreferenzen, ab und beziehen sich auf zwei verschiedene Objekte, daher der FALSE.

Guido sagte:
Darüber hinaus sind die Referenzen unterschiedlich, weil die Strings mit dem neuen Operator erstellt werden. Wenn Sie sie als String a = "TEST"; String b = "TEST"; erstellen, wird die Ausgabe wahrscheinlich TRUE sein, da die JVM die Existenz eines übereinstimmenden String-Objekts im String-Pool überprüft, den es beibehält, so dass das gleiche Objekt wiederverwendet werden würde.

+7

Zusätzlich die Referenzen sind unterschiedlich, da die Strings mit dem neuen Operator erstellt werden. Wenn Sie sie als String a = "TEST" erstellen; String b = "TEST"; dann wird die Ausgabe wahrscheinlich TRUE sein, da die JVM die Existenz eines übereinstimmenden String-Objekts in dem String-Pool prüft, den es behält, so dass das gleiche Objekt wiederverwendet werden würde. –

+2

Es _WILL_ wahr, nicht "wahrscheinlich". –

+1

@ Thorbjørn 100% sicher? Gibt die Java/JVM-Spezifikation an, dass der String-Pool obligatorisch ist und alles über seine Größe oder wie lange String-Referenzen aufbewahrt werden müssen? Ich weiß nicht warum, aber meine Intuition behauptet, dass es nur 99,9999% sicher ist. –

1

Der Code würde FALSE drucken. Eine korrigierte Version des Codes verwenden würde .equals() anstelle von ==

String a = new String ("TEST"); 

String b = new String ("TEST"); 

if(a.equals(b)) { 
    s.o.p ("TRUE"); 
} else { 
s.o.p ("FALSE"); 
} 
+0

Gut genug, aber da Alberto das schon erklärt hatte, fügte ich nur hinzu, wie man es korrigiert. Nächstes Mal werde ich auf die andere Antwort verweisen. – Ljdawson

1

Nur um es vollständig:

String a = new String ("TEST").intern(); 

String b = new String ("TEST").intern(); 

System.out.println(a == b); 

Diese true in den meisten Fällen zurück.

Das ist der Grund dafür:

public static void main(String [] args) { 
    // will return true 
    System.out.println(compare("TEST", "TEST")); 
} 

public static boolean compare (String a, String b) { 
    return a == b; 
} 
+1

Ja, aber das funktioniert nur für String-Literale, da sie Objekt wiederverwenden. Im Allgemeinen sollte 'equals' gegenüber' == 'bevorzugt werden. –

+0

funktioniert für jede interne() ed Zeichenfolge, literal oder anders. Es ist jedoch eine schlechte Idee, sich auf dieses Verhalten zu verlassen. equals() ist am besten zu verwenden. –

+0

Ihr beide richtig. Ich möchte nur zeigen, dass es eine Möglichkeit gibt, die Objektgleichheit zu verwenden. Dasselbe gilt für 'Interger.valueOf (200) == Integer.valueOf (200);' ... – scheffield

1

Wenn Sie erstellen ein neues Objekt (entweder String oder andere), was zurückgegeben wird eine Kopie des Wertes Verweis auf das neue Objekt. Wenn zwei Objekte denselben Bezug haben, wird der Operator == als wahr ausgewertet.

dh.

Object o = new Object(); 
Object p = o; //<-- assigning the same reference value 
System.out.println("o == p ? " + (o == p)); //<-- true 

Wenn Sie zwei Objekte jeder haben ihre eigenen Referenzwert:

Object a = new Object(); 
Object b = new Object(); 
System.out.println("o == p ? " + (o == p)); //<-- false 

Gleiche passiert mit Strings Objekte.

Wenn Sie ein String-Literal zuweisen, erhalten Sie die gleiche Referenz:

String x = "hello"; 
String y = "hello"; 

System.out.println("x == y ? " + (x == y)); //<-- true 

Aber Sie beispiels Sie Erstellen neue Objekte sind daher unterschiedliche Referenzwerte sie haben.

Um effektiv Strings (oder jedes andere Objekt) zu vergleichen, sollten Sie die equals() Methode verwenden.

Zeichenfolgenliterale werden standardmäßig an einen Zeichenfolgenpool gesendet, um die Leistung zu verbessern. Wenn Sie diesen Pool verwenden möchten, können Sie die Methode intern() aufrufen, die das Objekt im Pool zurückgibt, wenn es existiert.

String a = "world"; 
String b = new String("world"); 
String c = new String("world").intern();//<-- returns the reference value in the pool. 


System.out.println("a == b ? " + (a==b)); //<-- false 
System.out.println("b == c ? " + (b==c)); //<-- false 
System.out.println("a == c ? " + (a==c)); // true! 
0

Wenn zwei String-Variablen verweisen auf dasselbe Objekt dann diese beiden Variablen sind Referenzen für das gleiche Objekt genannt,

Also, wenn u diesen Vergleich programmatisch überprüfen möchten, == Operator verwendet wird. Wenn zwei Variablen die gleiche Objekt bezieht dann kehrt dieser Operator wahr Wert, und wenn sie es nicht tun, dann falsch Wert zurückgegeben

-1

Hier haben wir zwei neue Schlüsselwörter verwenden. Für jedes neue Schlüsselwort wird ein neues Objekt generiert.

Die == Methode überprüft für die hashcode des Objekts, in diesem Fall erhalten wir false als Antwort.