Überprüfung auf gleiche Instanzen von 2 verschiedenen (inkl. Beispiel)

8

Ich benutze das == in dem Code unten und gibt "Gleich" aus, warum? Kann jemand erklären, warum diese beiden verschiedenen Strings a und b gleich sind?

%Vor%     
Brent 07.09.2010, 03:56
quelle

6 Antworten

10

Dies liegt an String interning .

Java (Die JVM) speichert eine Sammlung von String Literalen, die verwendet wird, um Speicher zu sparen. Also, immer wenn Sie ein String wie folgt erstellen:

%Vor%

Java "Praktikanten" die Zeichenfolge. Wenn Sie jedoch String so erstellen:

%Vor%

Java wird das String nicht automatisch internieren. Wenn Sie Ihre Zeichenfolgen auf diese Weise erstellt haben, würde Ihr Code zu anderen Ergebnissen führen.

A Schnelle Google-Suche zeigt viele gute Ressourcen zu String interning.

    
jjnguy 07.09.2010, 04:00
quelle
2

Dieser Artikel erklärt es im Detail:

Was ist der Unterschied zwischen == und equals () in Java? ?

  

Nach der Ausführung von String a =   "Junge"; die JVM fügt das hinzu   String "Junge" an die Zeichenfolge   Pool und auf der nächsten Zeile des Codes, es   trifft wieder String b="Junge"; in diesem Fall die JVM bereits   weiß, dass diese Zeichenfolge bereits ist   Da im Pool, so schafft es kein   neue Zeichenfolge Also zeigen beide Saiten a und b auf die gleiche Saite, was sie bedeutet   Zeigen Sie auf die gleiche Referenz.

    
Leniel Macaferi 07.09.2010 03:58
quelle
2

String a = "boy"; erstellt ein neues String-Objekt mit dem Wert ("boy"), platziert es im String-Pool und macht a darauf aufmerksam.

Wenn der Interpreter String b = "boy"; sieht, prüft er zuerst, ob string "boy" im String-Pool vorhanden ist, da er vorhanden ist, kein neues Objekt erstellt wird und b für die Bezugnahme verwendet wird dasselbe Objekt, auf das sich a bezieht.

Da beide Referenzen den gleichen Inhalt enthalten, bestehen sie den Gleichheitstest.

    
codaddict 07.09.2010 04:01
quelle
1

Da die Laufzeit einen String-Pool hat und wenn Sie eine neue konstante Zeichenfolge zuweisen müssen, sieht die Laufzeit im Pool aus, wenn der Pool sie enthält, und sie setzen den Variablenpunkt auf das gleiche String-Objekt innerhalb des Pools Pool.

Aber Sie sollten nie darauf achten, ob der Inhalt gleich ist. Sie sollten die Methode equals

verwenden     
vodkhang 07.09.2010 04:00
quelle
0

Immer wenn wir eine Zeichenfolge wie folgt erstellen:

%Vor%

JVM überprüft das str2 = "abc" im String-Konstanten-Pool, wenn es vorhanden ist, dann erstellt es keinen neuen String, stattdessen zeigt es auf den String eins im String-Konstanten-Pool.

Aber im Fall von String str = new String("abc"); wird immer ein neues String-Objekt erstellt, aber wir können intern() function verwenden, um JVM zu zwingen, in den String-Konstanten-Pool zu schauen.

    
Brijesh 07.09.2010 09:15
quelle
0

Wie oben richtig erklärt, wird die Laufzeit im Fall von '==' im Pool String nach der Existenz der Zeichenkette suchen. Es ist jedoch sehr wahrscheinlich, dass während der Speicherbereinigung oder während Speicherproblemen die virtuelle Maschine den Zeichenfolgenpool möglicherweise zerstört. Der "==" Operator könnte daher den korrekten Wert zurückgeben oder nicht.

Lektion - Verwenden Sie immer equals() zum Vergleich.

    
Arup Chowdhary 07.09.2010 04:07
quelle