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:
Java "Praktikanten" die Zeichenfolge. Wenn Sie jedoch String
so erstellen:
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.
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.
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.
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
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.
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.
Tags und Links string java reference equality string-literals