Sobald Sie das Objekt instanziiert haben, können Sie seine Eigenschaften nicht mehr ändern. In Ihrer ersten Warnung ändern Sie nicht foo. Sie erstellen eine neue Zeichenfolge. Aus diesem Grund wird in Ihrer zweiten Warnung "foo" anstelle von "oo" angezeigt.
Bedeutet dies, dass beim Aufrufen von Methoden für eine Zeichenfolge die geänderte Zeichenfolge zurückgegeben wird, die ursprüngliche Zeichenfolge jedoch nicht geändert wird?
Ja. Nichts kann die Zeichenfolge ändern, sobald sie erstellt wurde. Dies bedeutet nicht, dass Sie der str
Variablen kein neues Zeichenfolgenobjekt zuweisen können. Sie können das aktuelle Objekt, auf das str verweist, einfach nicht ändern.
Wenn die Zeichenfolge veränderbar wäre, würde dies bedeuten, dass die 2. Warnung () ebenfalls oo zurückgibt?
Technisch gesehen nein, da die Teilstring-Methode eine neue Zeichenfolge zurückgibt. Wenn Sie ein Objekt veränderbar machen, ändert sich die Methode nicht. Wenn Sie es veränderbar machen, können Sie es technisch so gestalten, dass die Teilzeichenfolge die ursprüngliche Zeichenfolge ändert, anstatt eine neue zu erstellen.
Auf einer niedrigeren Ebene bedeutet Unveränderlichkeit, dass der Speicher, in dem die Zeichenfolge gespeichert ist, nicht geändert wird. Sobald Sie eine Zeichenfolge erstellt haben
"foo"
, wird Speicher zum Speichern des Werts zugewiesen"foo"
. Dieser Speicher wird nicht verändert. Wenn Sie die Zeichenfolge beispielsweise mit ändern,substr(1)
wird eine neue Zeichenfolge erstellt und ein anderer Teil des Speichers zugewiesen, der gespeichert wird"oo"
. Jetzt haben Sie zwei Zeichenfolgen im Speicher,"foo"
und"oo"
. Selbst wenn Sie es nicht mehr verwenden,"foo"
bleibt es so lange bestehen, bis der Müll gesammelt ist.Ein Grund, warum String-Operationen vergleichsweise teuer sind.
quelle
Unveränderlich bedeutet das, was nicht geändert oder modifiziert werden kann.
Wenn Sie also einer Zeichenfolge einen Wert zuweisen, wird dieser Wert von Grund auf neu erstellt und nicht ersetzt. Jedes Mal, wenn ein neuer Wert derselben Zeichenfolge zugewiesen wird, wird eine Kopie erstellt. In Wirklichkeit ändern Sie also niemals den ursprünglichen Wert.
quelle
Ich bin mir bei JavaScript nicht sicher, aber in Java machen Strings mit dem "String Constant Pool" einen zusätzlichen Schritt zur Unveränderlichkeit. Strings können mit String-Literalen (
"foo"
) oder mit einemString
Klassenkonstruktor erstellt werden. Mit Zeichenfolgenliteralen erstellte Zeichenfolgen sind Teil des Zeichenfolgenkonstantenpools, und dasselbe Zeichenfolgenliteral ist immer dieselbe Speicheradresse aus dem Pool.Beispiel:
Oben werden beide
lit1
undlit2
mit demselben Zeichenfolgenliteral erstellt, sodass sie auf dieselbe Speicheradresse zeigen.lit1 == lit2
ergibt sichtrue
, weil sie genau das gleiche Objekt sind.Wird
cons
jedoch mit dem Klassenkonstruktor erstellt. Obwohl der Parameter dieselbe Zeichenfolgenkonstante ist, weist der Konstruktor neuen Speicher zucons
, was bedeutet, dass ercons
nicht dasselbe Objekt wielit1
und istlit2
, obwohl er dieselben Daten enthält.Da die drei Zeichenfolgen alle dieselben Zeichendaten enthalten, gibt die Verwendung der
equals
Methode natürlich true zurück.(Beide Arten der Saitenkonstruktion sind natürlich unveränderlich)
quelle
Unveränderlich bedeutet, dass der Wert nicht geändert werden kann. Einmal erstellt, kann ein String-Objekt nicht mehr als unveränderlich geändert werden. Wenn Sie einen Teilstring eines Strings anfordern, wird ein neuer String mit dem angeforderten Teil erstellt.
Die Verwendung von StringBuffer während der Bearbeitung von Strings macht die Operation effizienter, da StringBuffer die Zeichenfolge in einem Zeichenarray mit Variablen speichert, um die Kapazität des Zeichenarrays und die Länge des Arrays zu speichern (Zeichenfolge in Form eines Zeichenarrays).
quelle
Die Lehrbuchdefinition der Veränderlichkeit kann oder kann geändert oder geändert werden. In der Programmierung bezeichnen wir mit dem Wort Objekte, deren Zustand sich im Laufe der Zeit ändern darf. Ein unveränderlicher Wert ist genau das Gegenteil - nachdem er erstellt wurde, kann er sich nie mehr ändern.
Wenn dies seltsam erscheint, möchte ich Sie daran erinnern, dass viele der Werte, die wir ständig verwenden, tatsächlich unveränderlich sind.
Ich denke, niemand wird überrascht sein zu erfahren, dass die zweite Zeile die Zeichenfolge in der Anweisung in keiner Weise ändert. Tatsächlich ändern keine Zeichenfolgenmethoden die Zeichenfolge, mit der sie arbeiten, sondern alle geben neue Zeichenfolgen zurück. Der Grund ist, dass Strings unveränderlich sind - sie können sich nicht ändern, wir können immer nur neue Strings erstellen.
Zeichenfolgen sind nicht die einzigen unveränderlichen Werte, die in JavaScript integriert sind. Zahlen sind auch unveränderlich. Können Sie sich überhaupt eine Umgebung vorstellen, in der die Auswertung des Ausdrucks 2 + 3 die Bedeutung der Zahl 2 ändert? Es klingt absurd, aber wir tun dies die ganze Zeit mit unseren Objekten und Arrays.
quelle
Von Strings zu Stacks ... ein einfach zu verstehendes Beispiel aus Eric Lipperts Blog :
Pfadfindung mit A * in C # 3.0, Teil 2 ...
Um die Unveränderlichkeit besser zu verstehen, lesen Sie Erics Beiträge, die mit diesem beginnen:
Unveränderlichkeit in C # Teil 1: Arten der Unveränderlichkeit
quelle
Eine Möglichkeit, dieses Konzept zu verstehen, besteht darin, zu untersuchen, wie Javascript alle Objekte behandelt. Dies bedeutet, dass alle Objekte nach der Instanziierung veränderbar sind. Dies bedeutet, dass Sie ein Objekt mit neuen Methoden und Eigenschaften hinzufügen können. Dies ist wichtig, da sich das Objekt nach der Instanziierung nicht ändern kann, wenn ein Objekt unveränderlich sein soll.
quelle