Literale String-Erstellung vs String-Objekt-Erstellung

7

Wie viele String-Objekte erstellt werden

Ich lerne für die SCJP. Ich kann mich nicht um dieses String-Problem kümmern. Ich sehe verschiedene mögliche Antworten, abhängig davon, wie ich eine Frage anschaue.

Wie viele String-Objekte werden in der folgenden Initialisierung erstellt?

%Vor%

Anfangs dachte ich 5 Objekte, d. h.

%Vor%

Aber wenn ich darüber nachdenke, bin ich mir nicht wirklich sicher, denn zum Beispiel wird der Compiler "A" + "B" als ein Objekt verketten? d. h. 7 Objekte erstellen?

%Vor%

Außerdem wird angegeben, wie viele Objekte erstellt werden, wenn der Code zu

geändert wurde %Vor%

Und wie wäre es mit:

%Vor%

Im obigen Beispiel denke ich, dass nur 2 Objekte erstellt werden

%Vor%

Stimmt das oder sind sie nicht verwandt? h., das Objekt, auf das von dem konstanten Pool Bezug genommen wird, wird sich von dem Objekt unterscheiden, auf das durch die Referenz s2 Bezug genommen wird.

Danke

Bearbeiten

Bitte beachten Sie auch, dass ich an der Gesamtzahl der erstellten Objekte interessiert bin, einschließlich derjenigen, die verworfen werden, und nicht nur derjenigen, die letztendlich im konstanten Pool landen.

Bearbeiten

Wenn ich Jon's Antwort anschaue, hätte ich die Art, wie die Objekte erstellt werden, völlig falsch verstanden. Ich weiß, dass ein String nur einmal im konstanten Pool erstellt wird und wiederverwendet wird, aber ich bin mir nicht sicher über den Prozess, der durchläuft, wenn der "letzte" String erstellt wird. Hier ist der Abschnitt aus dem Buch, das ich lese, was darauf hindeutet, dass temporäre Objekte entstehen, die den Antworten hier völlig entgegengesetzt sind. (Oder vielleicht ist das Buch falsch oder ich habe das Buch falsch verstanden)

Das Codebeispiel war

%Vor%

Die Frage war

  

Was ist die Ausgabe? Für zusätzliches Guthaben, wie viele String-Objekte und wie   Viele Referenzvariablen wurden vor der println-Anweisung erstellt .

Und die Antwort

  

Das Ergebnis dieses Codefragments ist spring water spring summer . Dort   sind zwei Referenzvariablen, s1 und s2. Es gab insgesamt acht   String-Objekte wie folgt erzeugt "Frühling", "Sommer" (verloren), "Frühling   Sommer "," fällt "(verloren)," Frühling Herbst "(verloren)," Frühling Sommer Frühling "   (verloren), "Winter" (verloren), "Frühlingswinter" (an diesem Punkt ist "Frühling")   hat verloren). Nur zwei der acht String-Objekte gehen dabei nicht verloren   Prozess

Danke

    
ziggy 29.11.2011, 19:39
quelle

3 Antworten

13

Der Compiler verkettet die Gesamtheit von "A" + "B" + "C" + "D" zu einer einzigen Konstante - so wird in Ihrem ersten Beispiel nur eine einzige Zeichenkette erzeugt em>. Die gleiche Zeichenfolge wird wiederverwendet, wenn Sie denselben Code mehrmals ausführen. Die Konstante wird in die Klassendatei geschrieben, und wenn die Klasse geladen wird, prüft die VM, ob eine gleiche Zeichenfolge bereits im Zeichenfolgenpool vorhanden ist - sie wird sie also wiederverwenden, selbst wenn Sie denselben Code in mehreren Klassen haben.

Sie können überprüfen, dass sich nur eine einzelne Zeichenfolge im Konstantenpool innerhalb der Klasse mit javap :

befindet %Vor%

Aber hier:

%Vor%

Sie haben am Ende zwei separate String-Objekte. Ein (die Konstante) wird jedes Mal wiederverwendet, wenn Sie den Code ausführen (und wird zwischen den beiden Anweisungen geteilt), und ein neuer wird aufgrund des Konstruktoraufrufs jedes Mal erstellt.

Also zum Beispiel diese Methode:

%Vor%

... endet mit sechs Stringobjekten - eines für die Konstante und fünf neuen , die bei jedem Aufruf der Methode erstellt werden.

    
Jon Skeet 29.11.2011, 19:44
quelle
4

Wie viele Objekte wurden erstellt?

%Vor%

Eins oder keins. Dies wird auf ein String-Literal reduziert, das bereits geladen sein könnte.

%Vor%

Dies erstellt immer ein zusätzliches Objekt.

BTW: Ein String besteht normalerweise aus zwei Objekten, dem String und dem char[] , die es umschließt.

    
Peter Lawrey 29.11.2011 19:49
quelle
2
%Vor%

Der Compiler erstellt nur ein Zeichenfolgenliteral "ABCD" und legt es im String-Pool ab. Ein Objekt wird erstellt (das im String-Pool).

%Vor%

Gleiches hier, nur dass Sie es aus dem String-Literal kopieren. Also, 2 Objekte werden hier erstellt. Eins nach dem new und eins nach dem String Pool.

%Vor%

Dasselbe gilt auch für "A" , eine Konstante im String-Pool. Der Konstruktor wird es kopieren. Also hier werden zwei Objekte erstellt.

    
Martijn Courteaux 29.11.2011 19:44
quelle

Tags und Links