Подтвердить что ты не робот

Включает ли оператор switch 7 с помощью String метод equals()?

Java 7 поддерживает переключение с Strings подобно приведенному ниже коду

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

Использует ли Java метод equals() для каждого случая String? Или он полагается на == или intern()?

Это просто эквивалентно:

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

UPDATE:

Строка в выражении switch сравнивается с выражениями связанные с каждым ярлыком case , как если бы метод String.equals был используется.

Как отмечают документы, поведение выглядит так, как будто вызывается equals().

4b9b3361

Ответ 1

docs сказать

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.

Поскольку он говорит , как будто, я предполагаю, что это не так, хотя внутренняя реализация будет такой же, как метод .equals().

Ответ 2

Оператор переключения Java 7 фактически генерирует байт-код, который использует методы hashCode() и equals(). Хэш-код используется для генерации более быстрого поиска коммутатора; т.е. избегать цепочки эквивалентных проверок, как вы могли бы получить цепочку if-else.

Ответ 3

Да.

"Оператор switch при использовании с String использует метод equals() сравнить данное выражение с каждым значением в выражении case и поэтому чувствителен к регистру и будет вызывать исключение NullPointerException если выражение равно null.

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

Ответ 4

Оператор switch при использовании с String использует метод equals() для сравнения данного выражения с каждым значением в инструкции case и поэтому учитывает регистр и бросает NullPointerException, если выражение null.