Wieso kann man Java Strings nicht verändern?
-
Hat das irgend einen Sinn?
-
Ja: du kannst Strings in deinem gesammten Programm rumkopieren ohne dass du Angst vor irgendwelchen Nebeneffekten haben musst. Und da Strings normalerweise sehr schnell, sehr weit wandern, ist das eine wirklich gute Idee.
Wenn du einen veränderlichen String benötigst, dann benutz die StringBuilder (oder StringBuffer)-Klasse.
-
Welche Nebeneffekte z.B.?
-
Also in Java ist String ja eine finale Klasse.
D.H. du kannst davon nicht ableiten.
Da die heutige Datenverarbeitung nahezu immer mit "Texten" abgewickelt wird (aka, Text aus Datenbank an Schicht 1 -> Text von Schicht 2 zu Schicht 3 -> ... -> GUI).So, wenn jetzt jeder am String rumbasteln könnte (also ableiten), dann kann sich die GUI nimmer sicher sein, ob sie wirklich noch einen echten String bekommt.
Hier mal ein sehr abstruses Beispiel:
Nimm mal an, die Schicht X wurde gehackt. Das wird jetzt mit einem neuen String betrieben, welcher aber seine Daten auch noch an einen bösen Hackerserver überträgt.Die Javamacher stellen so also sicher, dass es genau nur einen String gibt - und so weiß jeder mit was er rechnen kann, wenn er einen String anfasst.
-
Eine mögliche Art die Frage zu lesen, ich verstand sie eher, wieso man bei einem String keine Buchstaben mehr ersetzen kann.
Nebeneffekte: Auch hier gibts ein künstliches Beispiel: du liest Text aus einer Datei und stellst ihn auf dem Bildschirm dar. Jetzt bearbeitest du den Text, der String wird verändert. Die zuvor erstellte Sicherheits"kopie" leider auch...
-
Strings imitieren das Verhalten von Werttypen wie int, haben jedoch keine feste Größe und müssen daher auf dem Heap allokiert werden. Also hat man eine immutable class gemacht und siehe da, man kann sie wie Werttypen benutzen. Man übergibt sie einfach und die aufgerufene Funktion kann meinen String nicht verändern. Werttypen sind Gedanklich auch immutable. Wie kann man denn den Wert 2 verändern? Gar nicht, man kann nur an seine Variable ein anderes int zuweisen.
Immutable String haben auch ganz erhebliche Vorteile beim "kopieren" (kann man sich nämlich komplett sparen) und extrahieren von Substrings (weil man den Buffer weiter referenzieren kann, nur mit anderen Offset und Länge). Nicht zuletzt sind Strings dadurch thread-safe. Jeder Thread kann darauf lesen wie es ihm gerade passt, hunderte, völlig ohne Synchronisation. Das ist Luxus pur, sich darüber keine Gedanken machen zu müssen.