La machine virtuelle Java actuelle possède deux types de codes d'octet de commutation: LookupSwitch et TableSwitch.
Chaque cas dans une instruction switch a un offset entier, si ces décalages sont contigus (ou pour la plupart contigus sans grands espaces) (cas 0: cas 1: cas 2, etc.), alors TableSwitch est utilisé.
Si les décalages sont répartis avec de grands écarts (cas 0: cas 400: cas 93748 :, etc.), alors LookupSwitch est utilisé.
La différence, en bref, est que TableSwitch est effectué en temps constant car chaque valeur dans la plage de valeurs possibles reçoit un décalage de code d'octet spécifique. Ainsi, lorsque vous donnez à l'instruction un décalage de 3, il sait sauter 3 pour trouver la branche correcte.
Le commutateur de recherche utilise une recherche binaire pour trouver la branche de code correcte. Cela fonctionne en temps O (log n), ce qui est toujours bon, mais pas le meilleur.
Pour plus d'informations à ce sujet, voir ici: Différence entre LookupSwitch et TableSwitch de JVM?
Donc, pour déterminer lequel est le plus rapide, utilisez cette approche: si vous avez 3 cas ou plus dont les valeurs sont consécutives ou presque consécutives, utilisez toujours un commutateur.
Si vous avez 2 cas, utilisez une instruction if.
Pour toute autre situation, le changement est probablement plus rapide, mais ce n'est pas garanti, car la recherche binaire dans LookupSwitch pourrait rencontrer un mauvais scénario.
De plus, gardez à l'esprit que la JVM exécutera des optimisations JIT sur les instructions if qui tenteront de placer la branche la plus chaude en premier dans le code. C'est ce qu'on appelle la «prédiction de branche». Pour plus d'informations à ce sujet, voir ici: https://dzone.com/articles/branch-prediction-in-java
Vos expériences peuvent varier. Je ne sais pas que la JVM n'exécute pas une optimisation similaire sur LookupSwitch, mais j'ai appris à faire confiance aux optimisations JIT et à ne pas essayer de déjouer le compilateur.