La JVM corrente ha due tipi di codici byte dello switch: LookupSwitch e TableSwitch.
Ogni caso in un'istruzione switch ha un offset intero, se questi offset sono contigui (o per lo più contigui senza grandi spazi) (caso 0: caso 1: caso 2, ecc.), Viene utilizzato TableSwitch.
Se gli offset sono distribuiti con ampi spazi (caso 0: caso 400: caso 93748 :, ecc.), Viene utilizzato LookupSwitch.
La differenza, in breve, è che TableSwitch viene eseguito in tempo costante perché a ciascun valore all'interno dell'intervallo di valori possibili viene assegnato uno specifico offset di byte-code. Quindi, quando dai all'istruzione un offset di 3, sa di saltare avanti di 3 per trovare il ramo corretto.
L'opzione di ricerca utilizza una ricerca binaria per trovare il ramo di codice corretto. Funziona in tempo O (log n), che è ancora buono, ma non il migliore.
Per ulteriori informazioni su questo, vedere qui: Differenza tra LookupSwitch di JVM e TableSwitch?
Quindi, per quanto riguarda quale è il più veloce, usa questo approccio: se hai 3 o più casi i cui valori sono consecutivi o quasi consecutivi, usa sempre un interruttore.
Se hai 2 casi, usa un'istruzione if.
Per qualsiasi altra situazione, il passaggio è molto probabile veloce, ma non è garantito, poiché la ricerca binaria in LookupSwitch potrebbe colpire uno scenario negativo.
Inoltre, tieni presente che la JVM eseguirà le ottimizzazioni JIT sulle istruzioni if che cercheranno di posizionare il ramo più attivo per primo nel codice. Questa operazione è chiamata "Previsione del ramo". Per ulteriori informazioni su questo, vedere qui: https://dzone.com/articles/branch-prediction-in-java
Le tue esperienze possono variare. Non so che la JVM non esegua un'ottimizzazione simile su LookupSwitch, ma ho imparato a fidarmi delle ottimizzazioni JIT e non cercare di superare in astuzia il compilatore.