.NET C# Java Javascript Exception

 | 
Frage stellen Fragen Themen Mitglieder Abzeichen RSS-Feed
6
In Java sind Strings immutable bzw. unveränderlich. Warum? Ist das auch in anderen Sprachen so?
Themen:
27.10.09
ermin 1,2k 1 6
ermin 1,2k 1 6
4 Antworten
6
Es ist auch in .net so.

Eine ausführliche Behandlung dieses Themas bietet Why can’t string be mutable in java and .net.
27.10.09
gfoidl 6,6k 3 5
0
public class IchbinString{
public static void main(String args[]){
String s1 = new String("Hallo");
String s2 = new String("Du");
System.out.println(s1);
s1=s2;
System.out.println(s1);
}
}


Schau dir den Code mal an. Wenn Strings wirklich unveränderlich wären, dann sollte s1 "Hallo" ausgeben, aber wie du siehst gibt das zweite Output "Du" aus... Also sind Strings nicht so wirklich immutable ;)
28.10.09
Forlan 167 4
2
Doch sind sie :)
Bei der Anweisung s1=s2 wird von der Runtime eine neue Instanz von s1 erstellt und dieser Instanz der Wert von s2 zugewiesen.
Jetzt verliert die erste Generation von s1 seine Gültigkeit und kommt auf die Liste des GC zum entsorgen.
Also doch immutable ;)
klaus_b 28.10.09
Strings, die mit "new String("")" erzeugt werden, liegen zwar nicht im JVM String Pool, aber verändern kannst die ein so erzeugtes String-Objekt trotzdem nicht oder wie willst du aus dem "Hallo" Objekt ein "Hallo 2" Objekt machen, ohne ein neues Objekt zu erzeugen?
jenser78 28.10.09
1
@klaus_b:
Fast korrekter Kommentar ;)
In .net (und wie ich dem oberen Kommentar von jenser78 entnehme auch in Java) liegen die Strings in einem Pool und somit wird bei s1 = s2 nur der Verweis von s1 auf den Inhalt von s2 gesetzt, jedoch kein neues Objekt für s1 erstellt. Das ist möglich da auch s2 immutable ist.

Dies ermöglich auch die Strings als 'interned' zu vergleichen was u.U. sehr schnell sein kann ;)
gfoidl 28.10.09
@gfoidl
In den String Pool gelangen nur Strings, die nicht mit "new" erzeugt wurden. Wenn man sich dessen nicht bewußt ist (ging mir am Anfang so) kommt es oft zu Fehlern, die man nicht versteht. Zum Beispiel:

String s1 = "Hallo";
String s2 = "Hallo";

"s1 == s2" liefert hier "true", weil beide auf den selben String im Pool referenzieren, aber bei:

String s1 = "Hallo";
String s2 = new String("Hallo");

liefert s1 == s2 "false", weil "new" wirklich ein Objekt außerhalb des Pool erzeugt nur die Referenzen verglichen werden. Strings sollten immer nur mit equals() verglichen werden.
jenser78 28.10.09
@jenser78: Bezieht sich dein Kommentar auf Java und/oder .net?
In Java glaube ich deinem Kommentar da ich von Java keine Ahnung habe.
In .net ist es so wie ich oben kommentiert habe.

Aber Danke für den Hinweis dass das in Java nicht so ist.
gfoidl 28.10.09
@gfoidl
Da die ursprüngliche Frage Java betraf und ich nicht wusste ob es in Java auch einen String-Pool gibt, hab ich ihn aussen vor gelassen. Das das String-Objekt ein ganz besonderer Zeitgenosse ist, wollte ich die Erklärung einfach halten.
Ein Fehler wie sich im nach hinein herausstellte :-P
klaus_b 28.10.09
@gfoidl
Bezieht sich nur auf Java, da ich von .net keine Ahnung habe ;-)
jenser78 28.10.09
@klaus_b: Ich hab ja gewusst dass du das weißt ;) Die String-Klasse ist wirklich besonders mit ihren Eigenheiten ;)
gfoidl 28.10.09
0
Bitte löschen. Sollte ein Kommentar werden
28.10.09
klaus_b 1,4k 1 5
klaus_b 1,4k 1 5
0
Wären Strings in Java veränderlich, hätte man keine Sicherheit was den drinnen steckt.
Dann würde Java so etwas wie bei C++ Zeiger besitzen, und das wollten die Designer von Java nicht haben.

z.B.

String hallo ="Hallo";

methode (hallo);
System.out.println (hallo);

...

void methode (String para)
{
para.set("Tschüss"); // gibt es nicht
}


Wenn man aber ein solches Verhalten haben will, kann man es auch in Java erzielen.
z.B.
class MutableString
{
private String wert;
public void set (String pWert) {wert= pWert;}
public String get () {return wert;}
}
...
MutableString ms = new MutableString ();
ms.set ("Hallo");
methode (ms);
System.out.println (ms.get ());

...

void methode (MutableString para)
{
para.set("Tschüss"); // Das geht
}
01.11.09
stefan.bachert 322 3
Deine Antwort
Entweder einloggen... ...oder ohne Wartezeit registrieren
Name
Passwort
Passwort wiederholen
E-Mail
Geworben von


Login mit OpenID

Mit einem OpenID-Account kannst Du dich auf allen Webseiten anmelden, die OpenID unterstützen. Du hast bereits ein Benutzerkonto bei einem der folgenden Provider? Dann kannst Du dich direkt hier damit registrieren.


OpenID-Provider anklicken: