Einführung:
Der String Constant Pool ist eine Funktion von Java Virtual Machine (JVM), die konstante Werte speichert, einschließlich String-Literale. Wenn die JVM während der Kompilierung auf ein String-Literal stößt, überprüft sie den Pool auf ein vorhandenes mit demselben Wert. Wenn es gefunden wird, wird der Verweis auf das neue Literal auf den vorhandenen String verwiesen, wodurch die Erstellung einer neuen Instanz vermieden wird.
Internierung mit „neuem“ Schlüsselwort:
Allerdings , führt die Verwendung des Schlüsselworts „new“ beim Erstellen eines neuen String-Objekts zu einem anderen Verhalten, wie in den bereitgestellten Referenzen beschrieben. Während der Verweis auf das String-Literal („test“ in diesem Fall) weiterhin im Pool platziert wird, ist die JVM verpflichtet, zur Laufzeit ein neues String-Objekt zu erstellen, anstatt das Objekt aus dem Pool wiederzuverwenden.
Frage:
Wenn der Verweis auf das String-Literal im Pool derselbe ist wie bei der Erstellung mit „new“, sollte die JVM dann nicht den vorhandenen Verweis zurückgeben, anstatt einen neuen zu erstellen ?
Antwort:
Nein, die JVM gibt die vorhandene Referenz nicht zurück, wenn der „neue“ Operator verwendet wird. Stattdessen wird ein neues String-Objekt erstellt und es der durch das Schlüsselwort „new“ erstellten Referenz zugewiesen. Dies liegt daran:
Beispiel:
<code class="java">String literal = "test"; String one = new String(literal); String two = "test"; System.out.println(literal == two); // true (references in pool) System.out.println(one == two); // false (distinct objects)</code>
In diesem Beispiel verweisen die Referenzen „literal“ und „two“ auf dasselbe String-Objekt im Pool. Allerdings verweist die „one“-Referenz auf ein anderes String-Objekt, das von „new“ erstellt wurde. Daher gibt der Gleichheitsvergleich mit „==“ „falsch“ zurück.
Klarstellung:
Die Anweisung „Wenn der Compiler auf ein String-Literal stößt, überprüft er den Pool, um dies zu sehen.“ „Wenn bereits ein identischer String existiert“ sollte als „im Pool“ interpretiert werden, was bedeutet, dass nur String-Literale, die interniert oder explizit zum Pool hinzugefügt wurden, für die Internierung berücksichtigt werden.
Das obige ist der detaillierte Inhalt vonWarum erstellt Java ein neues String-Objekt, selbst wenn im Konstantenpool ein Verweis auf dasselbe Literal vorhanden ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!