2010-02-01 8 views

Antwort

6
String s = "Test"; 

Sucht zuerst nach der Zeichenfolge "Test" im String-Konstantenpool. Wenn gefunden wird, wird auf das gefundene Objekt Bezug genommen. Wenn nicht gefunden, wird ein neues String-Objekt erstellt, dem Pool hinzugefügt, und s wird erstellt, um auf das neu erstellte Objekt zu verweisen.

String s = new String("Test"); 

Erstellt zuerst ein neues String-Objekt und s verweist darauf. Zusätzlich wird ein Eintrag für den String "Test" im String-Konstanten-Pool gemacht, wenn nicht bereits dort ist.

So vorausgesetzt Zeichenfolge „Test“ ist nicht in dem Pool, die erste Erklärung wird ein Objekt erstellen, während die zweiten zwei Objekte schaffen.

+1

Wie ich es verstehe, die Suche/Objekt-Erstellung in der Konstante pool findet für alle Literale statt, die in einem Klassencode auftreten, wenn diese Klasse geladen wird, nicht wenn diese spezielle Codezeile ausgeführt wird. –

5

Der Unterschied in Begriff der Speicher ist, dass die Ausdrücke des Formulars: String s = "test" die "interned" Zeichenfolge verwendet, um eindeutige Instanzen zu teilen.

Der Aufruf der Form: String s = "test"
effizient ist im Vergleich zu String s = new String("test")

Der ersten Aufruf Nutzung des vorhandenen konstanten Ausdrucks macht (falls vorhanden), der zweite Anruf Verwendung eine neue Instanz erstellt, ohne dass jede vorhandene Instanz

Below Code Chunk zeigt dies:

String test = new String("test"); 
String internTest = "test"; 
String nonInternTest = new String("test"); 

System.out.println(test == internTest); // prints false 
System.out.println(test != nonInternTest); // prints true 
System.out.println(test.equals(nonInternTest)); // prints true 

Beachten Sie auch, dass die JLS das Verhalten legt somit sein:
Jeder Stringliteral ist ein Verweis 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, werden "interniert", um eindeutige Instanzen mit der Methode String.intern zu teilen.

0

Zuerst wird das String-Literal "Test" im String-Pool durchsucht, wenn es vorhanden ist, wird s darauf verweisen und kein neues erstellen. und erstellt neues Objekt nur dann, wenn das "Test" Literal nicht vorhanden ist.

aber im zweiten Fall wird es ein anderes Objekt erstellen, ohne zu viel Mühe, ob es vorhanden ist oder nicht.

1

String s = "Test"; // Erstellt ein String-Objekt und eine Referenzvariable In diesem einfachen Fall wird "Test" in den Pool aufgenommen und s wird darauf verweisen.

String s = new String ("Test"); // erstellt zwei Objekte und eine Referenzgröße In diesem Fall, weil wir das neue Schlüsselwort benutzt, Java wird ein neues String-Objekt in normalen (nicht Pool) Speichern erstellen, und s darauf verweisen wird. Zusätzlich wird das Literal "Test" im Pool platziert.

aber sie haben alle gemeinsam, dass sie alle ein neues String-Objekt mit einem -Wert von "Test" erstellen und es einer Referenzvariablen s zuweisen.

0

+ Der Unterschied zwischen dem Erstellen eines neuen String-Objekts und dem Erstellen einer Referenz ist nichts, aber wir sagen jvm, ein neues Objekt zu erstellen. und schaffen die Referenz bedeutet, dass wir das Objekt nur unser selbst erschaffen.

+0

Keine Frage. – Luv

Verwandte Themen