# Switch mit String



## CJChico (5. Feb 2015)

Hi,

wenn ich mit Strings im switch arbeiten möchte, muss ich dann eigentlich immer den direkten Wert (z.B. "abc"), bzw. eine finale varialbe benutzen oder gibt es auch ein weg normale String Objekte zu benutzen?

mfg
CJChico


----------



## VfL_Freak (5. Feb 2015)

Moin,


CJChico hat gesagt.:


> wenn ich mit Strings im switch arbeiten möchte, muss ich dann eigentlich immer den direkten Wert (z.B. "abc"), bzw. eine finale varialbe benutzen oder gibt es auch ein weg normale String Objekte zu benutzen?


Bitte was ?? :bahnhof:
Was sind für Dich *normale* String-Objekte ??

Dies hier sollte Deine Frage aber wahrscheinlich beantworten (gefunden duch kurzes Googlen  )
Strings in switch Statements
Java 7 Switch nun mit Strings

Gruß Klaus


----------



## CJChico (5. Feb 2015)

Die habe ich auch gefunden.

Diese beiden varianten funktionieren:

```
private final String def = "abc";
String abc = "abc";
switch(abc){
  case "abc":return true;
  case def: return true;
}
```

Ich möchte das hier machen:

```
String def = "abc";
String abc = "abc";
switch(abc){
  case def: return true;
}
```


Leider compiliert das nicht bei mir.


----------



## VfL_Freak (5. Feb 2015)

mal auf die Links geschaut ?????


----------



## Natac (5. Feb 2015)

Du kannst in einem Switch-Statement keine Variablen verwenden. Wenn du das wirklich möchtest, dann musst du eine if-Anweisung nehmen (ein switch ist ja eigentlich auch nichts anderes).


----------



## VfL_Freak (5. Feb 2015)

Natac hat gesagt.:


> Du kannst in einem Switch-Statement keine Variablen verwenden. Wenn du das wirklich möchtest, dann musst du eine if-Anweisung nehmen (ein switch ist ja eigentlich auch nichts anderes).


das macht dann unter Strich nix anderes !!!

```
switch( myString )
{
    case "Aaa":
```
ist doch wohl grundlegend das Gleiche wie

```
if( myString.equals("Aaa") )
```
oder ???:L

Gruß Klaus


----------



## CJChico (5. Feb 2015)

Joa schade, ich find den switch einbisschen übersichtilcher, danke.


----------



## stg (5. Feb 2015)

Jedes case-label _muss_ eine Compile-Time-Konstante sein.


----------



## InfectedBytes (5. Feb 2015)

VfL_Freak hat gesagt.:


> das macht dann unter Strich nix anderes !!!
> 
> ```
> switch( myString )
> ...



Es kommt zwar bei beidem das gleiche Ergebnis raus, aber dennoch arbeiten sie grundlegend anders. 

Eine If-Abfrage ist auch im Bytecode einfach nur eine If-Abfrage, wenn man nun aber sehr viele solcher Abfragen hintereindander hat, wird unter Umständen auch jede dieser abfragen durchgeführt.

Bei einem switch sieht es etwas anders aus. Dort wird (bei Strings) die hashCode Methode aufgerufen und mit Hilfe eines jumptables direkt zu der passenden Stelle gesprungen. Daher hat man in solchen Fällen große Performance unterschiede. 

Das war jetzt zwar nur ein grober Überblick, aber hoffe mal es war verständlich.


----------



## VfL_Freak (5. Feb 2015)

InfectedBytes hat gesagt.:


> Eine If-Abfrage ist auch im Bytecode einfach nur eine If-Abfrage, wenn man nun aber sehr viele solcher Abfragen hintereindander hat, wird unter Umständen auch jede dieser abfragen durchgeführt.


um jetzt mal richtig 'klug zu s******en':
Dafür wurden doch die IF - ELSE IF - ElSE-Konstrukte erfunden, oder ?

Gruß Klaus


----------



## InfectedBytes (5. Feb 2015)

```
if x.equals("a") ...
else if x.equals("b") ...
....
else ifx.equals("z")...
```
Falls dein String "a" ist, wird zwar nur eine Abfrage durchgeführt, aber wenn dein String eben ein "z" ist, müssen trotzdem alle Abfragen durchgeführt werden.
Und da macht es eben einen Unterschied.


----------



## VfL_Freak (5. Feb 2015)

Ok ok - Spezialfälle gibt es  immer!
Ist dann IMHO in Deinem Beispiel auch die Frage, ob das Ganze noch sinnvoll ist ...

Fakt ist, das beide Varianten i. d. R. funktionieren - so man sie denn richtig anwendet  - und für den Normalfall auch relativ gleichwertig sind!

Gruß
Klaus


----------



## xerion21 (5. Feb 2015)

VfL_Freak hat gesagt.:


> Ok ok - Spezialfälle gibt es  immer!
> Ist dann IMHO in Deinem Beispiel auch die Frage, ob das Ganze noch sinnvoll ist ...
> 
> Fakt ist, das beide Varianten i. d. R. funktionieren - so man sie denn richtig anwendet  - und für den Normalfall auch relativ gleichwertig sind!
> ...



Die Varianten sind gleichwertig, wobei ich den Vorpostern teilweise recht gebe: Die Case-Anweisung wird bei mehreren überprüfungen definitiv übersichtlicher als mehrere else-if-Blöcke


----------



## Thallius (5. Feb 2015)

Hindert Dich ja keiner dran von dem String selber irgendeinen Integer-Hash zu errechnen und den zu benutzen. Dann kannst du wieder switch verwenden.

Gruß

Claus


----------



## AndiixAndii (5. Feb 2015)

InfectedBytes hat gesagt.:


> ```
> if x.equals("a") ...
> else if x.equals("b") ...
> ....
> ...



Wollte nur mal so einstreuen, dass man seit Java 7/8 (?) Strings inhaltlich auch mit == vergleichen kann.

LG!


----------



## VfL_Freak (5. Feb 2015)

Moin,



AndiixAndii hat gesagt.:


> Wollte nur mal so einstreuen, dass man seit Java 7/8 (?) Strings inhaltlich auch mit == vergleichen kann.


Das halte ich für ein Gerücht !!
IMHO testet "=="  weiterhin die Referenzgleichheit und ".equals()" die Wertgleichheit!

Wo hast Du das denn her ??
Gruß Klaus

Hier noch schnell ein Link hierzu:
How do I compare strings in Java? - Stack Overflow


----------



## InfectedBytes (5. Feb 2015)

AndiixAndii hat gesagt.:


> Wollte nur mal so einstreuen, dass man seit Java 7/8 (?) Strings inhaltlich auch mit == vergleichen kann.
> 
> LG!




Nein das ist falsch.
Führe einfach mal folgenden Code aus und gib "abc" ein.

```
Scanner scanner = new Scanner(System.in);
if(scanner.nextLine() == "abc") {
  System.out.println("gleich");
}else{
  System.out.println("ungleich");
}
```


----------



## nvidia (5. Feb 2015)

VfL_Freak hat gesagt.:


> [...]Wo hast Du das denn her ?[...]



Er hat das mit dem "String constant pool" nicht verstanden. Ein Blick in die JLS könnte ihm helfen
Chapter 3. Lexical Structure


----------



## AndiixAndii (5. Feb 2015)

nvidia hat gesagt.:


> Er hat das mit dem "String constant pool" nicht verstanden. Ein Blick in die JLS könnte ihm helfen
> Chapter*3.*Lexical Structure



Dass man mittlerweile mit == inhaltich vergleiche kann, hat mir heute ein Lehrer gesagt :O
Habs gerade getestet, geht wirklich nicht.


----------



## nvidia (6. Feb 2015)

AndiixAndii hat gesagt.:


> Dass man mittlerweile mit == inhaltich vergleiche kann, hat mir heute ein Lehrer gesagt :O
> Habs gerade getestet, geht wirklich nicht.



Das ist ja auch teilweise richtig, unter welchen Bedingungen das funktioniert findest du hinter dem Link den ich vorher postete. Da aber in den meisten Fällen nicht mit Bestimmheit gesagt werden kann ob ein String ein Literal ist oder aus einem konstanten Ausdruck herrührt, ist es anzuraten equals zu verwenden.


----------

