Heim > Java > javaLernprogramm > Warum erstellt Java ein neues String-Objekt, selbst wenn im Konstantenpool ein Verweis auf dasselbe Literal vorhanden ist?

Warum erstellt Java ein neues String-Objekt, selbst wenn im Konstantenpool ein Verweis auf dasselbe Literal vorhanden ist?

DDD
Freigeben: 2024-11-03 07:26:02
Original
641 Leute haben es durchsucht

Why Does Java Create a New String Object Even When a Reference to the Same Literal Exists in the Constant Pool?

Java String Constant Pool: Internierungs- und Referenzgleichheit

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:

  • Literale Internierung: Wenn der Compiler auf das String-Literal „test“ stößt, prüft er, ob im Pool ein identischer String vorhanden ist. Da keins vorhanden ist, wird ein neues String-Objekt mit dem Wert „test“ erstellt und im Pool platziert.
  • Objektkonstruktion mit „new“:Wenn Sie einen neuen String erstellen Objekt mithilfe von „new String(literal)“ zu erstellen, wird der Verweis auf das Literal („test“) an den Konstruktor übergeben. Dies bedeutet, dass die Referenz im Konstruktor denselben Wert hat wie das Literal im Pool.
  • Neue Objekterstellung: Der „new“-Operator weist die JVM jedoch an, einen neuen String zu erstellen Objekt. Dieses neue Objekt ist eine andere Instanz als die im Pool gespeicherte, auch wenn sie sich auf denselben Literalwert beziehen.

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage