Sucht zuerst im String-Konstanten-Pool nach der Zeichenfolge "Test". Wenn gefunden wird, wird auf das gefundene Objekt Bezug genommen. Wenn nicht gefunden, wird ein neues String-Objekt erstellt, das dem Pool hinzugefügt wird, und s wird erstellt, um auf das neu erstellte Objekt zu verweisen.
%Vor%Erstellt zuerst ein neues String-Objekt und verweist darauf. Zusätzlich wird im String-Konstanten-Pool ein Eintrag für den String "Test" gemacht, wenn nicht schon da ist.
Wenn also angenommen wird, dass die Zeichenfolge "Test" nicht im Pool enthalten ist, erstellt die erste Deklaration ein Objekt, während die zweite zwei Objekte erstellt.
Der Unterschied im Begriff des Gedächtnisses ist, dass die Ausdrücke des Formulars:
String s = "test"
verwendet die Zeichenfolge "interned", um eindeutige Instanzen zu teilen.
Der Aufruf von form: String s = "test"
ist effizient im Vergleich zu String s = new String("test")
Der erste Aufruf verwendet den vorhandenen konstanten Ausdruck (falls es einen gibt), Der zweite Aufruf erstellt eine neue Instanz, ohne eine vorhandene Instanz zu verwenden.
Der folgende Code-Chunk demonstriert dies:
Beachten Sie auch, dass die JLS das Verhalten angibt sei also:
Jedes String-Literal ist eine Referenz auf eine Instanz der Klasse String (§4.3.3). String-Objekte haben einen konstanten Wert. String-Literale - oder allgemeiner gesagt, Strings, die die Werte von konstanten Ausdrücken sind, sind interniert, um eindeutige Instanzen mit der Methode String.intern zu teilen.
String s="Test"; // Erstellt ein String-Objekt und eine Referenzvariable In diesem einfachen Fall wird "Test" in den Pool verschoben und s wird darauf verweisen.
String s = neu String ("Test"); // erstellt zwei Objekte und eine Referenzvariable In diesem Fall erstellt Java ein neues String-Objekt, weil wir das neue Schlüsselwort verwendet haben im normalen (Nicht-Pool-) Speicher, und s wird sich darauf beziehen. Darüber hinaus wird das wörtliche "Test" in den Pool gelegt werden.
aber was sie gemeinsam haben ist, dass sie alle ein neues String-Objekt erstellen, mit einem Wert von "Test", und weisen Sie es einer Referenzvariable s zu.
Zuerst wird das String-Literal "Test" im String-Pool durchsucht, wenn es vorhanden ist, wird s darauf verweisen und kein neues erstellen. und erstellt ein neues Objekt nur, wenn das "Test" Literal nicht vorhanden ist.
aber im zweiten Fall wird es ein anderes Objekt erstellen, ohne sich darum zu kümmern, ob es vorhanden ist oder nicht.