Ответ 1
Использование оператора switch быстрее, чем equals (но заметно только при наличии нескольких строк), потому что сначала использует hashCode
строки, в которой switch
для определения подмножества строк, которые могли бы возможно, совпадают. Если более чем одна строка в ярлыках case имеет один и тот же хэш-код, JVM будет выполнять последовательные вызовы equals
, и даже если в метках case есть только одна строка, которая имеет hashCode, JVM необходимо вызвать equals
для подтверждения что строка в метке case действительно равна той, что находится в выражении switch.
Производительность запуска коммутатора по объектам String сопоставима с поиском в HashMap
.
Этот фрагмент кода:
public static void main(String[] args) {
String s = "Bar";
switch (s) {
case "Foo":
System.out.println("Foo match");
break;
case "Bar":
System.out.println("Bar match");
break;
}
}
Внутренне скомпилирован и выполнен как этот кусок кода:
(не буквально, но если вы декомпилируете обе части кода, вы увидите, что происходит точная последовательность действий)
final static int FOO_HASHCODE = 70822; // "Foo".hashCode();
final static int BAR_HASHCODE = 66547; // "Bar".hashCode();
public static void main(String[] args) {
String s = "Bar";
switch (s.hashCode()) {
case FOO_HASHCODE:
if (s.equals("Foo"))
System.out.println("Foo match");
break;
case BAR_HASHCODE:
if (s.equals("Bar"))
System.out.println("Bar match");
break;
}
}