„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > String-Konstantenpool: Warum erstellt „new“ ein neues String-Objekt, selbst wenn das Literal vorhanden ist?

String-Konstantenpool: Warum erstellt „new“ ein neues String-Objekt, selbst wenn das Literal vorhanden ist?

Veröffentlicht am 06.11.2024
Durchsuche:175

String Constant Pool: Why Does \

String-Konstanten-Pool: Eine eingehende Untersuchung

String-Literale in Java werden gepoolt, um die Speichernutzung zu optimieren und die Leistung zu steigern. Das heißt, wenn ein String-Literal gefunden wird, überprüft der Compiler den String-Konstantenpool auf ein vorhandenes String-Objekt mit demselben Wert. Wenn der Verweis gefunden wird, wird er auf das vorhandene Objekt verwiesen, wodurch die Erstellung eines neuen Objekts vermieden wird.

Allerdings kommt es zu Verwirrung, wenn der „new“-Operator zum Erstellen eines neuen String-Objekts verwendet wird, da dies scheinbar der Regel widerspricht des Praktikums. Um dies zu verdeutlichen, untersuchen wir die folgenden Anweisungen:

  • "Wenn der Compiler auf ein String-Literal stößt, überprüft er den Pool, um festzustellen, ob bereits ein identischer String vorhanden ist."
  • "In Im Fall von „new“ werden Verweise auf String-Literale weiterhin in die Konstantentabelle eingefügt, aber wenn Sie „new“ verwenden, muss die JVM zur Laufzeit ein neues String-Objekt erstellen, anstatt das Objekt aus der Konstante zu verwenden Tabelle.“

Diese Anweisungen zeigen an, dass das String-Literal zwar interniert und im Pool gespeichert wird, die Verwendung von „new“ die JVM jedoch dazu zwingt, ein neues String-Objekt zu erstellen. Dies bedeutet, dass der „new“-Operator trotz der Existenz eines äquivalenten Strings im Pool diesen umgeht und ein neues Objekt im Nicht-Pool-Speicher zuweist.

Betrachten Sie zur Veranschaulichung das folgende Beispiel:

String one = new String("test");
String two = "test";
System.out.println(one.equals(two)); // true
System.out.println(one == two); // false

Wie erwartet ist der Wert von „one“ und „two“ „test“, aber der „==“-Vergleich gibt „false“ zurück, da sie sich auf unterschiedliche String-Objekte beziehen. Dies liegt daran, dass die Verwendung von „new“ die Erstellung eines neuen String-Objekts für „one“ erzwingt, obwohl das String-Literal „test“ bereits im Pool vorhanden ist.

Zusammenfassend lässt sich sagen, dass der String-Konstantenpool optimiert wird Speichernutzung durch Internierung von String-Literalen. Die Verwendung von „new“ umgeht jedoch den Pool und erstellt ein neues String-Objekt im Nicht-Pool-Speicher. Dies führt zu zwei unterschiedlichen String-Objekten mit demselben Wert, aber unterschiedlichen Referenzen.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3