A HashMap, по существу, имеет производительность O (1), в то время как состояние коммутатора может иметь либо O (1), либо O (log (n)) в зависимости от того, использует ли компилятор переключатель tablewitch или lookup.
Понятно, что если оператор switch написан как таковой,
switch (int) {
case 1:
case 2:
case 3:
case 4:
default:
}
тогда он будет использовать табличный интерфейс и, очевидно, имеет преимущество перед стандартным HashMap. Но что, если оператор switch разрежен? Это были бы два примера, которые я бы сравнивал:
HashMap<Integer, String> example = new HashMap<Integer, String>() {{
put(1, "a");
put(10, "b");
put(100, "c");
put(1000, "d");
}};
.
switch (int) {
case 1:
return "a";
case 10:
return "b";
case 100:
return "c";
case 1000:
return "d";
default:
return null;
}
Что обеспечит большую пропускную способность, lookupswitch или HashMap? Накладные расходы на HashMap дают преимущество поиска раньше, но в конечном итоге сокращаются по мере увеличения числа случаев/записей?
Изменить: Я пробовал некоторые тесты с использованием JMH, вот мои результаты и используемые коды. https://gist.github.com/mooman219/bebbdc047889c7cfe612 Как вы, ребята, упомянули, оператор lookupswitch превзошел HashTable. Мне все еще интересно, почему.