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?
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
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.
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
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
:
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.
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.
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.
Dasselbe gilt auch für "A"
, eine Konstante im String-Pool. Der Konstruktor wird es kopieren. Also hier werden zwei Objekte erstellt.