2013-09-05 11 views
24

Java 7 obsługuje przełączanie z Strings jak poniższy kodCzy instrukcja przełącznika Java 7 z użyciem String używa metody equals()?

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

Czy Java wywołać metodę equals() na każdym String przypadku? Lub opiera się na == lub intern()?

Czy to po prostu odpowiednik:

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

UPDATE:

String w wyrażeniu przełącznik jest w porównaniu z wyrażeń związane z każdorazowo etykiecie jakby metoda String.equals sprzyjały używane.

Dokumenty podkreślają, że zachowanie jest takie, jak gdyby wywołano equals().

+0

1) powinny Myślę, że musiałby to, ponieważ nie ma sensu, jeśli nie zrobił, prawda? 2) Czy spojrzałeś na kod źródłowy? –

+0

@HovercraftFullOfEels - Może użyć '==' i polegać na 'intern '- ale myślę, że w wielu przypadkach by się złamało. – OldCurmudgeon

+0

@ OldCurmudgeon: zbyt ryzykowne, pomyślałem. –

Odpowiedz

22

docs powiedzieć

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. 

Ponieważ mówi jakby moje przypuszczenie byłoby to nie chociaż realizacja wewnętrzny byłby taki sam jak .equals metoda().

+0

Czy istnieje inny mechanizm, którego mógłby użyć kompilator, który nie będzie polegał na szczegółach implementacji łańcuchów, które mogłyby zostać zmienione w przyszłych implementacjach, poza możliwością wstępnego sprawdzenia równości referencyjnej przed wywołaniem metody wirtualnej [a może nawet przed spopielaniem? ] – supercat

3

Oświadczenie switch gdy używana z String wykorzystuje metodę equals() porównać dany wyraz każdej wartości w rachunku case i dlatego jest wielkość liter i rzuci NullPointerException jeśli wyrażenie jest null.

6

Tak.

„Instrukcja switch gdy używana z String wykorzystuje equals() metoda porównać dany wyraz każdej wartości w rachunku przypadku i dlatego jest wielkość liter i będzie rzucać NullPointerException jeśli wyrażenie ma wartość null. "

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

+1

Ponieważ niektóre losowy post na blogu mówi, że nie musi to oznaczać, że jest poprawny. – cowls

+1

Zrobiłem naprawdę sporo badań na ten temat, moja odpowiedź zawierała tylko jeden z używanych przeze mnie zasobów. –

7

Instrukcja przełącznika Java 7 faktycznie generuje kod bajtowy, który wykorzystuje zarówno metody hashCode() i equals(). Kod skrótu służy do generowania szybszych wyszukiwań przełączników; tj. aby uniknąć łańcucha równych kontroli takich jak w przypadku łańcucha if-else.

+0

Czy kiedykolwiek przetestować równość odniesienia przed obliczeniem kodu skrótu? Przypuszczam, że byłoby dość powszechne, że wartość przełącznika byłaby referencyjna - równa jednej z etykiet przełączników. – supercat

+0

Nie, nie sądzę. Wydaje się, że najpierw oblicza się kod skrótu, przeskocz do sekcji z ciągami dla tego kodu, a następnie sprawdź równe wartości tych łańcuchów (zwykle tylko jeden). – Steinar

+0

Interesujące. Sądzę, że łańcuchy podane do instrukcji 'switch' będą literałami więcej niż przez połowę czasu, chociaż myślę, że hashowanie może nadal być wygraną *, jeśli * albo został już obliczony kod skrótu * lub * będzie potrzebny w przyszłość. – supercat

Powiązane problemy