Heim  >  Artikel  >  Java  >  Warum erstellt „new String()“ ein neues Objekt, auch wenn bereits ein String mit demselben Wert im String-Konstantenpool vorhanden ist?

Warum erstellt „new String()“ ein neues Objekt, auch wenn bereits ein String mit demselben Wert im String-Konstantenpool vorhanden ist?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-03 05:58:30250Durchsuche

Why does

String-Konstanten-Pool: Internierung und den „neuen“ Operator verstehen

In Java werden String-Literale wie „abc“ interniert , was bedeutet, dass sie im String-Konstantenpool gespeichert werden und Verweise darauf gemeinsam genutzt werden. Wenn jedoch ein neues String-Objekt mit dem „new“-Operator erstellt wird, wird ein neues Objekt im Speicher erstellt, anstatt auf ein vorhandenes im Pool zu verweisen.

Widersprüchliche Aussagen zu diesem Verhalten haben zu Missverständnissen geführt. Während die JVM beim Auffinden eines Literals prüft, ob im Pool vorhandene Zeichenfolgen vorhanden sind, gilt diese Prüfung nur für tatsächlich internierte Zeichenfolgen. Wenn auf ein Literal im Nicht-Pool-Speicher verwiesen wird (mit „new“), wird ein neues Objekt erstellt, auch wenn bereits eine passende Zeichenfolge im Pool vorhanden ist.

Um dies zu veranschaulichen, betrachten Sie den folgenden Code:

<code class="java">String one = new String("test");
String two = "test";</code>

„test“ ist ein Literal, das intern ist, daher befindet sich bereits ein Verweis darauf im Pool. Wenn jedoch eines mit „new“ erstellt wird, wird ein neues String-Objekt im Speicher zugewiesen, was bedeutet, dass es eine andere Referenz als zwei hat.

<code class="java">System.out.println(one.equals(two)); // true
System.out.println(one == two);      // false</code>

Die Methode equal() vergleicht die Werte der Strings sind gleich, aber der ==-Operator vergleicht ihre Referenzen, die unterschiedlich sind.

Die Verwirrung kann durch Anweisungen entstehen, die implizieren, dass mit „new“ erstellte Zeichenfolgen immer noch im Pool platziert werden, aber das ist irreführend. Während eine Zeichenfolge mit demselben Wert wie das Literal irgendwo im Speicher vorhanden sein kann, wird sie nicht zum Pool hinzugefügt und ist nicht über das Literal selbst zugänglich.

Daher wird bei Verwendung des „neuen“ Operators die JVM Erstellt ein neues String-Objekt im Speicher, anstatt einen Verweis auf ein vorhandenes Objekt aus dem Pool zurückzugeben, selbst wenn eines mit demselben Wert vorhanden ist.

Das obige ist der detaillierte Inhalt vonWarum erstellt „new String()“ ein neues Objekt, auch wenn bereits ein String mit demselben Wert im String-Konstantenpool 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