Em vez disso, eu acho mais simples assim:
if (nome.equalsIgnoreCase(nomes[i]))
Não só porque fica mais sucinto e - na minha opinião - mais legível, mas também porque acaba sendo mais otimizado.
Ao chamar toLowerCase()
, vc acaba gerando uma nova string (então nesse caso, são geradas duas strings), e só depois começa a ser feita a comparação entre elas. Já equalsIgnoreCase
começa fazendo a comparação caractere a caractere, e já retorna false
assim que encontra alguma diferença (e se não encontrar, ainda sim é melhor porque não precisou gerar strings extras).
Claro que para códigos com poucas comparações, a diferença será irrelevante, mas ainda sim, eu prefiro usar equalsIgnoreCase
. Até porque tem outros casos em que pode dar diferença. Ex:
String s1 = "I";
String s2 = "İ";
System.out.println(s1.toLowerCase().equals(s2.toLowerCase())); // false
System.out.println(s1.equalsIgnoreCase(s2)); // true
No caso, a string s1
tem o caractere I
(a letra “i” maiúscula), mas s2
tem o caractere İ
(é uma letra “i” com um “pinguinho” em cima), que é outro caractere, diferente do “I” maiúsculo.
Apesar disso, equalsIgnoreCase
considera que são iguais, por motivos de “Unicode contém várias dessas bizarrices”
Se quiser saber porque dá diferença, é porque a versão lowercase delas de fato é diferente. Basta imprimir os code points de cada uma:
String s1 = "I";
String s2 = "İ";
System.out.println("s1:");
s1.toLowerCase().codePoints().forEach(c -> System.out.printf("%06X\n", c));
System.out.println("s2:");
s2.toLowerCase().codePoints().forEach(c -> System.out.printf("%06X\n", c));
A saída é:
s1:
000069
s2:
000069
000307
Isso mesmo, s2.toLowerCase()
retorna uma string com dois code points (inclusive, s2.toLowerCase().length()
é 2
).
E esse não é o único caso, letras gregas como ϴ
e ϑ
também dão o mesmo resultado (equals
com toLowerCase
retorna false
, mas equalsIgnoreCase
retorna true
).
Claro que se tiver apenas textos em português, esses problemas não ocorrem. Mas ainda sim, usar equalsIgnoreCase
, além de deixar - na minha opinião - mais claro e sucinto, ainda evita criar duas strings à toa (e na verdade vai criar bem mais, já que isso está dentro de um loop).