La JVM actual tiene dos tipos de códigos de bytes de conmutación: LookupSwitch y TableSwitch.
Cada caso en una instrucción switch tiene un desplazamiento entero, si estos desplazamientos son contiguos (o en su mayoría contiguos sin espacios grandes) (caso 0: caso 1: caso 2, etc.), entonces se usa TableSwitch.
Si las compensaciones se extienden con grandes espacios (caso 0: caso 400: caso 93748 :, etc.), se utiliza LookupSwitch.
La diferencia, en resumen, es que TableSwitch se realiza en tiempo constante porque a cada valor dentro del rango de valores posibles se le asigna un desplazamiento de código de byte específico. Por lo tanto, cuando le da a la declaración un desplazamiento de 3, sabe que debe saltar 3 para encontrar la rama correcta.
El interruptor de búsqueda utiliza una búsqueda binaria para encontrar la rama de código correcta. Esto se ejecuta en tiempo O (log n), que sigue siendo bueno, pero no el mejor.
Para obtener más información sobre esto, consulte aquí: ¿ Diferencia entre LookupSwitch y TableSwitch de JVM?
En cuanto a cuál es el más rápido, utilice este enfoque: si tiene 3 o más casos cuyos valores son consecutivos o casi consecutivos, utilice siempre un interruptor.
Si tiene 2 casos, use una declaración if.
Para cualquier otra situación, lo más probable es que el cambio sea más rápido, pero no está garantizado, ya que la búsqueda binaria en LookupSwitch podría tener un mal escenario.
Además, tenga en cuenta que la JVM ejecutará optimizaciones JIT en declaraciones if que intentarán colocar la rama más activa primero en el código. Esto se llama "Predicción de ramas". Para obtener más información sobre esto, consulte aquí: https://dzone.com/articles/branch-prediction-in-java
Tus experiencias pueden variar. No sé si la JVM no ejecuta una optimización similar en LookupSwitch, pero he aprendido a confiar en las optimizaciones de JIT y a no intentar burlarme del compilador.