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