String s = "hello";
String backup_of_s = s;
s = "bye";
Zu diesem Zeitpunkt enthält die Sicherungsvariable noch den ursprünglichen Wert "Hallo" (dies liegt an der Unveränderlichkeit von String, oder?).
Aber ist es wirklich sicher , Strings mit dieser Methode zu kopieren (was natürlich nicht sicher ist, reguläre veränderbare Objekte zu kopieren), oder ist es besser, dies zu schreiben? ::
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
Mit anderen Worten, was ist der Unterschied (falls vorhanden) zwischen diesen beiden Schnipsel?
BEARBEITEN - der Grund, warum das erste Snippet sicher ist:
Lassen Sie mich die Dinge anhand der bereits gegebenen guten Antworten (die sich im Wesentlichen auf die Frage des Leistungsunterschieds zwischen den beiden Ausschnitten konzentrierten) etwas detaillierter erläutern:
Strings sind in Java unveränderlich, was bedeutet, dass ein String-Objekt nach seiner Erstellung nicht mehr geändert werden kann. Daher,
String s = "hello";
Erstellt eine neue String-Instanz und weist ihre Adresse zu s
( s
als Referenz auf die Instanz / das Objekt).
String backup_of_s = s;
Erstellt eine neue Variable backup_of_s
und initialisiert sie so, dass sie auf das Objekt verweist, auf das aktuell verwiesen wird s
.
Hinweis: Die Unveränderlichkeit von Zeichenfolgen garantiert, dass dieses Objekt nicht geändert wird: Unsere Sicherung ist sicher
Hinweis 2: Der Java-Garbage-Collection-Mechanismus garantiert, dass dieses Objekt nicht zerstört wird, solange es von mindestens einer Variablen referenziert wird ( backup_of_s
in diesem Fall).
Schließlich wird s = "bye";
eine weitere String-Instanz erstellt (aufgrund der Unveränderlichkeit ist dies der einzige Weg) und die s
Variable so geändert , dass sie jetzt auf das neue Objekt verweist.
s
, um auf ein anderes Objekt zu verweisen (dasString
"Tschüss"). Dies hat keinen Einfluss darauf, worauf sich die Referenzvariablebackup_of_s
bezieht (dasString
"Hallo"). Wie gesagt, ich könnte ein gleichwertiges Beispiel mitStringBuilder
s liefern , die nicht unveränderlich sind. Mein Kommentar bezieht sich hauptsächlich auf die OPs-Anweisung: Zu diesem Zeitpunkt enthält die Sicherungsvariable noch den ursprünglichen Wert "Hallo" (dies liegt an der Unveränderlichkeit von String, oder?).Zeichenfolgen sind unveränderliche Objekte, sodass Sie sie kopieren können, indem Sie nur den Verweis auf sie kopieren, da sich das referenzierte Objekt nicht ändern kann ...
So können Sie problemlos wie in Ihrem ersten Beispiel kopieren:
quelle
Ihre zweite Version ist weniger effizient, da sie ein zusätzliches Zeichenfolgenobjekt erstellt, wenn dies einfach nicht erforderlich ist.
Unveränderlichkeit bedeutet, dass sich Ihre erste Version so verhält, wie Sie es erwarten, und daher der bevorzugte Ansatz ist.
quelle
Der zweite Fall ist auch in Bezug auf den String-Pool ineffizient. Sie müssen intern () bei der Rückgabereferenz explizit aufrufen, um ihn intern zu machen.
quelle
Wie wäre es mit einer Kopie wie dieser? Ich denke, eine neue Kopie zu bekommen ist besser, damit die Daten von
str1
nicht beeinflusst werden, wennstr2
referenziert und in einer weiteren Aktion geändert werden.quelle
String
ist unveränderlich. Das Klonen von Strings macht nicht viel Sinn.