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);
}
}| 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
|
String hallo ="Hallo";
methode (hallo);
System.out.println (hallo);
...
void methode (String para)
{
para.set("Tschüss"); // gibt es nicht
}
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
}