Comparando strings em Java

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.