Heim >Java >javaLernprogramm >Wie geht der Java-String-Pool mit „neuer String(\'literal\')' um?

Wie geht der Java-String-Pool mit „neuer String(\'literal\')' um?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-03 12:11:29886Durchsuche

How Does the Java String Pool Handle `new String(

String-Konstanten-Pool: Missverständnisse klären

In Java sind „String-Literale“ wie „abc“ interniert, was bedeutet, dass mehrere Verweise auf denselben Literalwert auf denselben verweisen Instanz im Speicher. Dies hilft, die Speichernutzung und Leistung zu optimieren. Wenn Sie jedoch „new“ mit einem String-Literal verwenden, beispielsweise „new String(“abc“), wird ein neues String-Objekt erstellt, auch wenn das Literal bereits im String-Pool vorhanden ist.

Es wurden zwei Aussagen bezüglich des String-Pools ausgegeben etwas Verwirrung:

  • Aussage 1: „Wenn der Compiler auf ein String-Literal stößt, überprüft er den Pool, um zu sehen, ob bereits ein identischer String vorhanden ist.“
  • Aussage 2: „Wenn Sie new mit einem String-Literal verwenden, werden Verweise auf das Literal weiterhin in die Konstantentabelle (den String-Literal-Pool) eingefügt, aber die JVM erstellt zur Laufzeit ein neues String-Objekt. „

Zur Klarstellung: Aussage 2 impliziert, dass String-Literale auch dann noch im String-Pool interniert sind, wenn ein Objekt mit new erstellt wird, aber trotzdem ein neues Objekt erstellt wird.

In der Beispiel:

String one = new String("test");
String two = "test";

Der an new String("test") übergebene Verweis ist aufgrund der Internierung derselbe wie zwei. Es wird jedoch ein neues String-Objekt mit dem Wert „test“ erstellt und einem zugewiesen.

Es gibt also zwei separate String-Objekte mit dem Wert „test“: eines im Konstantenpool (referenziert durch zwei) und ein neues, das mit new erstellt wurde (durch eins referenziert). Aus diesem Grund ist one.equals(two) wahr (sie haben den gleichen Wert), aber one == two ist falsch (sie beziehen sich auf unterschiedliche Objekte).

Aussage 1 sollte umformuliert werden als „Wenn der Compiler trifft ein String-Literal, prüft es, ob bereits ein identischer String _im Pool_ vorhanden ist.“ Zeichenfolgen werden nur dann interniert, wenn sie explizit interniert sind oder als Literale in Klassendefinitionen verwendet werden.

Das obige ist der detaillierte Inhalt vonWie geht der Java-String-Pool mit „neuer String(\'literal\')' um?. 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