Peço permissão ao Entanglement para postar um programa que ele mostrou no GUJ:
class TesteSwitch { public static void main (String[] args) { String s = "desprezível"; switch (s) { case "desprezível": System.out.println ("despicable"); break; case "auréola": System.out.println ("halo"); break; case "fungo": System.out.println ("fungus"); break; case "fujão": System.out.println ("fugitive"); break; case "abstruso": System.out.println ("abstruse"); break; } } }Sendo que esse programa foi transformado pelo compilador para o equivalente a:
class TesteSwitch { public static void main (String[] args) { String s = "desprezível"; int hashCode = s.hashCode(); int i = -1; switch (hashCode) { case -644512679: if (s.equals ("auréola")) i = 1; else if (s.equals("desprezível") i = 0; break; case 97793703: if (s.equals ("fujão") i = 3; else if (s.equals("fungo") i = 2; break; case 1732918561: if (s.equals ("abstruso") i = 4; break; default: break; } switch (i) { case 0: System.out.println ("despicable"); break; case 1: System.out.println ("halo"); break; case 2: System.out.println ("fungus"); break; case 3: System.out.println ("fugitive"); break; case 4: System.out.println ("abstruse"); break; } } }
O compilador transforma 1 switch em 2, porque é mais fácil tratar de certos casos (como "fallthrough" e strings que têm exatamente o mesmo hash code). Por exemplo, no caso acima, "auréola" e "desprezível" têm o mesmo hash code, assim como "fujão" e "fungo". E é por isso que o switch checa se o hash code E a string são os mesmos do caso. Se o switch tiver muitos casos, essa implementação é mais rápida que simplesmente ir comparando com "ifs" encadeados.
Obviamente, assim como no caso do "switch" com inteiros, é necessário ver se o seu problema não poderia ser resolvido com hierarquias de classes ou então com enums.