Dies bezieht sich auf den Unterschied in dem Ergebnis, das vom Operator '+' zurückgegeben wird. Ergebnis variiert für String-Literal und String-Objekt.
%Vor%Mit dem Ergebnis können wir folgern, dass mit literal, bereits verfügbares Objekt aus dem String-Pool zurückgegeben wird, wie im Fall von Zeile 3 und mit String-Objekt neues Objekt zurückgegeben wird, wie in Zeile 5. Warum ist es so?
Der +
-Operator für String
s wird abhängig vom Zeitpunkt der Auswertung des Ausdrucks unterschiedlich behandelt.
Wenn der Ausdruck zur Kompilierzeit ausgewertet werden kann (wie in Zeile 3), erstellt der Compiler ein String
, das nur die Verkettung enthält. Daher wird in Zeile 3 nur der String
"abc" erstellt und dieser String
wird in die .class Datei geschrieben. Daher sind str3
und str4
genau gleich und werden interniert.
Bei Verwendung einer Verkettung, die nur zur Laufzeit ausgewertet werden kann (wie in Zeile 5), ist die resultierende String
eine neue String
, die mit equals()
verglichen werden muss, da es ein neues Objekt ist.
String str2 = "ab"+"c";
Dies wird bei compile Zeit ausgewertet. Es geht in den Konstantenpool, da es dem Compiler schon bekannt ist.
Der andere kann unter Laufzeit ausgewertet werden, er ist nicht Teil des konstanten Pools.
Es ist eine gute Gelegenheit, den Unterschied zu bemerken, wenn Sie String # concat , wenn Sie dies tun
String str2 = "ab".concat("c");
Da String unveränderlich ist, wird ein neuer String von concat
zurückgegeben, der str
nicht interniert. In diesem Fall wird str2 == str3
false
sein.
Ich habe die Frage als Duplikat markiert, aber festgestellt, dass eine ähnliche Antwort nicht gepostet wird, also denke ich daran, es zu versuchen. Andere Antworten haben bereits darauf hingewiesen, warum die Antwort falsch ist. Aber hier ist etwas, das Ihnen zeigt, wann es wahr sein wird.
Wenn Sie intern()
für die zweite Zeichenfolge aufrufen, lautet das Ergebnis true
.
Warum funktioniert das?
Um Speicher zu sparen (und den Test auf Gleichheit zu beschleunigen), unterstützt Java das "Interning" von Strings. Wenn die intern()
-Methode für einen String aufgerufen wird, wird eine Suche für eine Tabelle internierter Strings durchgeführt. Wenn sich bereits ein String-Objekt mit demselben Inhalt in der Tabelle befindet, wird ein Verweis auf den String in der Tabelle zurückgegeben. Andernfalls wird der String zur Tabelle hinzugefügt und eine Referenz darauf zurückgegeben.
Das explizite Aufrufen von intern()
gibt einen Verweis auf den String interned zurück.
Wenn Sie str, str1, str2 und str3 erstellen, zeigt es auf den gleichen String-Pool. Hier wird kein String-Objekt erstellt. Aber wenn Sie String str4 = str + str1.So str4 wird zur Laufzeit ausgewertet werden.So ist nicht Teil des gleichen String-Pool, wo alle anderen Zeichenfolgen spitz sind.So str4 gibt false zurück.