new String()
ist ein Ausdruck, der ein String
... erzeugt, und a String
ist unveränderlich, egal wie es erzeugt wird.
(Zu fragen, ob new String()
veränderlich ist oder nicht, ist unsinnig. Es ist Programmcode, kein Wert. Aber ich gehe davon aus, dass Sie das nicht wirklich gemeint haben.)
Wenn ich ein String-Objekt erstelle, wie String c = "";
wird ein leerer Eintrag im Pool erstellt?
Ja; Das heißt, für die leere Zeichenfolge wird ein Eintrag erstellt. Es ist nichts Besonderes an einem leeren String
.
(Um pedantisch zu sein, wird der Pooleintrag für ""
lange vor der Ausführung Ihres Codes erstellt. Tatsächlich wird er erstellt, wenn Ihr Code geladen wird ... oder möglicherweise sogar früher.)
Ich wollte also wissen, ob das neue Heap-Objekt auch unveränderlich ist, ...
Ja ist es. Die Unveränderlichkeit ist jedoch eine grundlegende Eigenschaft von String-Objekten. Alle String
Objekte.
Sie sehen, die String
API bietet einfach keine Methoden zum Ändern von a String
. Also (abgesehen von einigen gefährlichen und dummen 1 Tricks mit Reflexion) können Sie a nicht mutieren String
.
und wenn ja, was war der Zweck?
Der Hauptgrund dafür, dass Java String
als unveränderliche Klasse konzipiert ist, ist die Einfachheit. Es erleichtert das Schreiben korrekter Programme und das Lesen / Begründen des Codes anderer Personen, wenn die Kernzeichenfolgenklasse eine unveränderliche Schnittstelle bietet.
Ein wichtiger zweiter Grund ist, dass die Unveränderlichkeit von String
grundlegende Auswirkungen auf das Java-Sicherheitsmodell hat. Aber ich glaube nicht, dass dies ein Treiber für das Design der Originalsprache war ... in Java 1.0 und früher.
Anhand der Antwort stelle ich fest, dass andere Verweise auf dieselbe Variable einer der Gründe sind. Bitte lassen Sie mich wissen, ob ich das richtig verstehe.
Nein, es ist grundlegender als das. Alle String
Objekte sind einfach unveränderlich. Es ist keine komplizierte Argumentation für Sonderfälle erforderlich, um dies zu verstehen. Es ist nur >> <<.
Wenn Sie für den Datensatz ein veränderbares "string-like" Objekt in Java möchten, können Sie StringBuilder
oder verwenden StringBuffer
. Dies sind jedoch verschiedene Typen von String.
1 - Der Grund, warum diese Tricks (IMO) gefährlich und dumm sind, besteht darin, dass sie sich auf die Werte von Zeichenfolgen auswirken, die möglicherweise von anderen Teilen Ihrer Anwendung über den Zeichenfolgenpool gemeinsam genutzt werden. Dies kann Chaos verursachen ... auf eine Weise, dass der nächste Typ, der Ihren Code verwaltet, kaum eine Chance hat, ihn aufzuspüren.