# Unterschied zwischen String & char Array?



## bipolar minds (27. Mrz 2010)

Hallo, 
habe nochmal zwei Fragen:
1. siehe Titel (wie wird String gespeichert?)
2. Warum geht folgendes:
	
	
	
	





```
String s1 = "a", s2 = "b";

s1		=="a"		//true
"a"+"b"       =="ab"	//true
s1+s2 	=="ab" 	//false
```

Warum ist das beim ersten kein Typfehler?
Ich dachte s1 ist nur die Referenzvariable und "a" der String auf den s1 zeigt.


----------



## Gelöschtes Mitglied 5909 (27. Mrz 2010)

1. in nem char array
2. 

zeile 3: compiler optimierung
zeile 4: compiler optimierung
zeile 5: kann der compiler nicht optimieren
-> immer mit equals vergleichen


----------



## bipolar minds (27. Mrz 2010)

sorry, ich weiß nicht genau was du mit compiler optimierung meinst


----------



## eRaaaa (27. Mrz 2010)

Bei konstanten Werten/Strings, führt der Compiler diese automatisch zusammen. Z.B. macht er bei Integern bei int c = 2+4 --> c=6 (wenn es wie gesagt Konstanten sind), das gleiche macht er auch bei Strings. Dann gibts auch noch den Pool, aber genaueres findest du auch hier:
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 4.2 Strings und deren Anwendung
unter *"Strings im Konstantenpool"*


----------



## hdi (27. Mrz 2010)

Es gibt einen sog. _String Constant Pool_, den Java intern verwaltet. Dort werden String-Literale abgespeichert wenn sie ohne new-Operator erzeugt werden. Wann immer ein String ohne new-Operator angelegt wird, wird erstmal gecheckt ob es diesen String (inhaltsgemäß) schon im Constant Pool gibt. Wenn ja, wird kein neues Objekt angelegt sondern lediglich die selbe Referenz verwendet.


```
String s1 = "a", s2 = "b"; // zwei neue Einträge im String Constant Pool "a" und "b"
s1 == "a"       // "a" ist hier ein String-Literal, das es bereits im Constant Pool gibt. Deswegen wird für dieses "a" und das "a" in s1 die selbe Referenz verwendet, d.h. Identität gilt (== true)
"a"+"b"    == "ab"    // "a"+"b" erzeugt neuen Eintrag im Constant Pool, das zweite "ab" matcht dann mit genau diesem wieder, d.h. wieder selbe Referenz daher == true.
s1+s2   =="ab"  // Die Konkatenation von zwei Strings erzeugt einen neuen String per new-Operator (wenn es keine Literale sondern Variablen sind), d.h. der Constant Pool wird hier nicht berücksichtigt. "ab" wird aus dem Constant Pool genommen, s1+s2 ist aber ein neues Objekt, daher Identität nicht gleich!
```

Anm: (s1+s2).equals("ab") würde true ergeben, das ist eben der Unterschied zwischen Gleichheit (equals) und Identität (==)

edit: Ich bin mir gar nicht sicher ob Konkatenation mit Variablen tatsächlich ein neues Objekt anlegt, und Konkatenation mit Literalen nicht ?? Aber das war jetzt für mich die Schlussfolgerung daraus dass es eben != true ist. Aber vllt kann das n Profi hier nochmal bestätigen oder widerlegen


----------



## bipolar minds (27. Mrz 2010)

dankeschön... zumindest verstehe ich es so wie du es jetzt erklärt hast...


----------

