Comparando strings em Java
1. Visão geral
Neste artigo, vamos falar sobre as diferentes maneiras de compararStrings em Java.
ComoString é um dos tipos de dados mais usados em Java, essa é uma operação naturalmente muito usada.
2. String Comparação com a classeString
2.1. Usando o operador de comparação“==”
Usar o operador "==" para comparar valores de texto é um dos erros mais comuns que os iniciantes em Java cometem. Isso é incorreto porque“==” only checks the referential equality of two Strings, significa se eles fazem referência ao mesmo objeto ou não.
Vejamos um exemplo desse comportamento:
String string1 = "using comparison operator";
String string2 = "using comparison operator";
String string3 = new String("using comparison operator");
assertThat(string1 == string2).isTrue();
assertThat(string1 == string3).isFalse();
No exemplo acima, a primeira afirmação é verdadeira porque as duas variáveis apontam para o mesmo literalString.
Por outro lado, a segunda asserção é falsa porquestring1 é criado com um literal estring3 é criado usando o operadornew - portanto, eles fazem referência a objetos diferentes.
2.2. Usandoequals()
A classeString substitui osequals() herdados deObject.This method compares two Strings character by character, ignoring their address.
Considera-os iguais se tiverem o mesmo comprimento e os caracteres estiverem na mesma ordem:
String string1 = "using equals method";
String string2 = "using equals method";
String string3 = "using EQUALS method";
String string4 = new String("using equals method");
assertThat(string1.equals(string2)).isTrue();
assertThat(string1.equals(string4)).isTrue();
assertThat(string1.equals(null)).isFalse();
assertThat(string1.equals(string3)).isFalse();
Neste exemplo, as variáveisstring1, string2,estring4 são iguais porque têm o mesmo caso e valor, independentemente de seu endereço.
Parastring3, o método retornafalse,, pois diferencia maiúsculas de minúsculas.
Além disso, se qualquer uma das duas strings fornull, o método retornaráfalse.
2.3. UsandoequalsIgnoreCase()
O métodoequalsIgnoreCase() retorna um valor booleano. Como o nome sugere, este métodoignores casing in characters while comparing Strings:
String string1 = "using equals ignore case";
String string2 = "USING EQUALS IGNORE CASE";
assertThat(string1.equalsIgnoreCase(string2)).isTrue();
2.4. UsandocompareTo()
O métodocompareTo() retorna um valor do tipoint ecompares two Strings character by character lexicographically com base em um dicionário ou ordem natural.
Este método retorna 0 se doisStrings forem iguais ou se ambos foremnull,a número negativo se o primeiroString vier antes do argumento, e um número maior que zero se o primeiroString vem depois do argumentoString.
Vamos ver um exemplo:
String author = "author";
String book = "book";
String duplicateBook = "book";
assertThat(author.compareTo(book))
.isEqualTo(-1);
assertThat(book.compareTo(author))
.isEqualTo(1);
assertThat(duplicateBook.compareTo(book))
.isEqualTo(0);
2.5. UsandocompareToIgnoreCase()
OcompareToIgnoreCase() é semelhante ao método anterior, exceto que ignora maiúsculas e minúsculas:
String author = "Author";
String book = "book";
String duplicateBook = "BOOK";
assertThat(author.compareToIgnoreCase(book))
.isEqualTo(-1);
assertThat(book.compareToIgnoreCase(author))
.isEqualTo(1);
assertThat(duplicateBook.compareToIgnoreCase(book))
.isEqualTo(0);
3. String Comparação com a classeObjects
Objects é uma classe de utilitário que contém um métodoequals() estático, útil neste cenário - para comparar doisStrings.
O método retornatrue se doisStrings são iguais porfirstcomparing them using their address, ou seja, “==”. Consequentemente, se ambos os argumentos foremnull, ele retornarátruee exatamente um argumento fornull, ele retornará falso.
Caso contrário, ele simplesmente chama o métodoequals() da classe do tipo do argumento passado - que em nosso caso é o métodoString’s classequals(). Este método diferencia maiúsculas de minúsculas porque ele chama internamente o métodoequals() da classeString.
Vamos testar isso:
String string1 = "using objects equals";
String string2 = "using objects equals";
String string3 = new String("using objects equals");
assertThat(Objects.equals(string1, string2)).isTrue();
assertThat(Objects.equals(string1, string3)).isTrue();
assertThat(Objects.equals(null, null)).isTrue();
assertThat(Objects.equals(null, string1)).isFalse();
4. String Comparação comApache Commons
The Apache Commons library contains a utility class called StringUtils for String-related operations; isso também tem alguns métodos muito benéficos para a comparação deString.
4.1. Usandoequals() and equalsIgnoreCase ()
O métodoequals() da classeStringUtils é uma versão aprimorada do método de classeStringequals(), que também lida com valores nulos:
assertThat(StringUtils.equals(null, null))
.isTrue();
assertThat(StringUtils.equals(null, "equals method"))
.isFalse();
assertThat(StringUtils.equals("equals method", "equals method"))
.isTrue();
assertThat(StringUtils.equals("equals method", "EQUALS METHOD"))
.isFalse();
O métodoequalsIgnoreCase() deStringUtils retorna um valorboolean. Isso funciona de maneira semelhante aequals(),, exceto que ignora a capitalização dos caracteres emStrings:
assertThat(StringUtils.equalsIgnoreCase("equals method", "equals method"))
.isTrue();
assertThat(StringUtils.equalsIgnoreCase("equals method", "EQUALS METHOD"))
.isTrue();
4.2. UsandoequalsAny() e equalsAnyIgnoreCase ()
O primeiro argumento do métodoequalsAny() éStringe o segundo é um tipo de argumentos múltiplosCharSequence. O método retornatrue se qualquer um dos outrosStrings dados corresponderem contra o primeiro casoString sensivelmente.
Caso contrário, false será retornado:
assertThat(StringUtils.equalsAny(null, null, null))
.isTrue();
assertThat(StringUtils.equalsAny("equals any", "equals any", "any"))
.isTrue();
assertThat(StringUtils.equalsAny("equals any", null, "equals any"))
.isTrue();
assertThat(StringUtils.equalsAny(null, "equals", "any"))
.isFalse();
assertThat(StringUtils.equalsAny("equals any", "EQUALS ANY", "ANY"))
.isFalse();
O métodoequalsAnyIgnoreCase() funciona de forma semelhante ao métodoequalsAny(), mas também ignora maiúsculas e minúsculas:
assertThat(StringUtils.equalsAnyIgnoreCase("ignore case", "IGNORE CASE", "any")).isTrue();
4.3. Usandocompare() e compareIgnoreCase ()
O métodocompare() na classeStringUtils é um métodonull-safe version of the compareTo() da classeStringe trata os valoresnull porconsidering a null value less than a non-null value. Dois valoresnull são considerados iguais.
Além disso, este método pode ser usado para classificar uma lista deStrings com entradasnull:
assertThat(StringUtils.compare(null, null))
.isEqualTo(0);
assertThat(StringUtils.compare(null, "abc"))
.isEqualTo(-1);
assertThat(StringUtils.compare("abc", "bbc"))
.isEqualTo(-1);
assertThat(StringUtils.compare("bbc", "abc"))
.isEqualTo(1);
O métodocompareIgnoreCase() se comporta de forma semelhante, exceto que ignora o caso:
assertThat(StringUtils.compareIgnoreCase("Abc", "bbc"))
.isEqualTo(-1);
assertThat(StringUtils.compareIgnoreCase("bbc", "ABC"))
.isEqualTo(1);
assertThat(StringUtils.compareIgnoreCase("abc", "ABC"))
.isEqualTo(0);
Os dois métodos também podem ser usados com a opçãonullIsLess. Este éa third boolean argument which decides if null values should be considered less or not.
Um valornull é inferior a outroString senullIsLess for verdadeiro e superior senullIsLess for falso.
Vamos experimentar:
assertThat(StringUtils.compare(null, "abc", true))
.isEqualTo(-1);
assertThat(StringUtils.compare(null, "abc", false))
.isEqualTo(1);
O métodocompareIgnoreCase() com um terceiro argumentoboolean funciona de maneira semelhante, exceto por ignorar maiúsculas e minúsculas.
5. Conclusão
Neste tutorial rápido, discutimos diferentes maneiras de compararStrings.
E, como sempre, o código-fonte dos exemplos pode ser encontradoover on GitHub.