Heim >Java >javaLernprogramm >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?

Susan Sarandon
Susan SarandonOriginal
2024-11-03 08:05:30865Durchsuche

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.

Es kommt jedoch 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 Aussagen:

  • "Wenn der Compiler auf ein String-Literal stößt, überprüft er den Pool, um zu sehen, 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 weisen darauf hin, 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.

Um dies zu veranschaulichen, betrachten Sie 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.

Das obige ist der detaillierte Inhalt vonString-Konstantenpool: Warum erstellt „new' ein neues String-Objekt, selbst wenn das Literal vorhanden ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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