Was ist der Unterschied zwischen der Zuweisung und dem Erstellen einer String-Instanz?

8

In einer Interviewfrage hat Interviewer mich gefragt

Was ist der Gemeinsame und Unterschied zwischen den folgenden Aussagen:

%Vor%

Gibt es einen Unterschied in der Speicherzuordnung?

    
Shashi 01.02.2010, 06:34
quelle

5 Antworten

6
%Vor%

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.

    
codaddict 01.02.2010, 06:41
quelle
5

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:

%Vor%

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.

    
sateesh 01.02.2010 06:50
quelle
1

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.

    
sap 01.02.2010 10:29
quelle
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 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.

    
GuruKulki 01.02.2010 08:17
quelle
0

+ Der Unterschied zwischen dem Erzeugen eines neuen String-Objekts und dem Erstellen einer Referenz ist nichts anderes als dass wir jvm mitteilen, ein neues Objekt zu erstellen. und schaffen Sie das Reference bedeutet, dass wir das Objekt nur unser selbst erschaffen.

    
anand 06.07.2010 12:26
quelle

Tags und Links