2013-09-05 7 views
24

Java 7 supporta la commutazione con Strings come il codice qui sottoL'istruzione switch Java 7 con String usa il metodo equals()?

switch (month.toLowerCase()) { 
case "january": 
    monthNumber = 1; 
    break; 
case "february": 
    monthNumber = 2; 
    break; 
default: 
    monthNumber = 0; 
    break; 
} 

fa Java chiamare il metodo equals() su ogni String caso? O si basa su == o ?

E` semplicemente equivalente a:

String month = month.toLowerCase(); 
if("january".equals(month)){ 
monthNumber = 1; 
}else if("february".equals(month)){ 
monthNumber = 1; 
}.. 

UPDATE:

La stringa nell'espressione interruttore viene confrontata con le espressioni associata a ogni caso etichetta come se metodo String.equals erano in uso.

Come i documenti sottolineano che il comportamento è come se fosse chiamato equals().

+0

1) dovrei pensare che avrebbe dovuto, dal momento che non ha senso se non ha, è vero? 2) Hai guardato il codice sorgente? –

+0

@HovercraftFullOfEels - Potrebbe usare '==' e fare affidamento su 'intern' - ma penserei che si spezzerebbe in molti casi. – OldCurmudgeon

+0

@OldCurmudgeon: troppo rischioso, penserei. –

risposta

22

Il docs dicono

The String in the switch expression is compared with the expressions associated 
with each case label as if the String.equals method were being used. 

Poiché si dice come se La mia ipotesi è che non se l'implementazione interna sarebbe lo stesso di .equals() metodo.

+0

Esiste un altro meccanismo che un compilatore potrebbe usare e che non si baserebbe sui dettagli dell'implementazione delle stringhe a cui le future implementazioni sarebbero permesse di cambiare, a parte forse l'uguaglianza dei riferimenti prima della chiamata al metodo virtuale [e forse anche prima dell'hash? ] – supercat

3

Il switch economico quando utilizzato con un String utilizza il metodo equals() per confrontare l'espressione data a ciascun valore nell'istruzione case ed è quindi sensibile e minuscole e lancerà una NullPointerException se l'espressione è null.

6

Sì.

"L'istruzione switch quando viene utilizzato con una stringa utilizza equals() metodo per confrontare il dato espressione ciascun valore nel caso dichiarazione ed è quindi sensibile-caso e gettare un NullPointerException se l'espressione è zero."

http://java.dzone.com/articles/new-java-7-feature-string

+1

Perché alcuni post sul blog casuale dice che non significa necessariamente che sia corretto. – cowls

+1

In realtà ho fatto ricerche approfondite su questo argomento, la mia risposta conteneva solo una delle risorse che ho usato. –

7

L'istruzione switch Java 7 genera in realtà bytecode che utilizza entrambi i metodi hashCode() e equals(). Il codice hash viene utilizzato per generare ricerche di switch più veloci; vale a dire evitare una catena di controlli uguali come si otterrebbe con una catena if-else.

+0

Verifica mai l'uguaglianza di riferimento prima di calcolare il codice hash? Direi che sarebbe abbastanza comune che un valore di interruttore fosse di riferimento, uguale a una delle etichette di commutazione. – supercat

+0

No, non la penso così. Sembra calcolare prima l'hashcode, passare alla sezione con String per quel codice hash e quindi controllare equals su quelle stringhe (di solito solo una). – Steinar

+0

Interessante. Io penserei che le stringhe date a una istruzione 'switch' sarebbero letterali più della metà del tempo, anche se immagino che l'hashing potrebbe ancora essere una vittoria * se * o un codice hash è già stato calcolato * o * sarà necessario in futuro. – supercat