Eu quero comparar duas strings para igualdade em Java, quando uma ou ambas podem ser null
, então não posso simplesmente chamar .equals()
. Qual é a melhor maneira?
boolean compare(String str1, String str2) {
...
}
Editar:
return ((str1 == str2) || (str1 != null && str1.equals(str2)));
Respostas:
É isso que o código interno Java usa (em outros
compare
métodos):fonte
<0
,==0
ou>0
para indicar qual é inferior / ralador do que o outroObjects.equals(Object, Object)
como Mark Rotteveel assinalou em sua resposta (por favor upvote-lo)Desde o Java 7, você pode usar o método estático
java.util.Objects.equals(Object, Object)
para executar verificações iguais em dois objetos sem se preocupar com elesnull
.Se ambos os objetos estiverem,
null
ele retornarátrue
; se um estivernull
e outro não, retornaráfalse
. Caso contrário, ele retornará o resultado da chamadaequals
no primeiro objeto com o segundo como argumento.fonte
Object.equals(Object)
não há verificação do tipo de tempo de compilação. OObjects.equals(Object, Object)
funciona muito bem o mesmo que um normal,equals
e re inferência / cheques por IDE, essas regras são heurísticas que também são suportados paraObjects.equals(Object, Object)
(por exemplo, IntelliJ IDEA 2.016,2 tem o mesmo cheque para ambos os iguais normais e o de objetos).Para esses casos, seria melhor usar o Apache Commons StringUtils # igual , pois ele já manipula cadeias nulas. Exemplo de código:
Se você não deseja adicionar a biblioteca, basta copiar o código-fonte do
StringUtils#equals
método e aplicá-lo quando necessário.fonte
Para aqueles no Android, que não podem usar o Object.equals da API 19 (str1, str2), existe o seguinte:
É nulo seguro. Raramente é necessário usar o método string.equals () mais caro, porque seqüências de caracteres idênticas no android quase sempre comparam true com o operando "==" graças ao Pool de cordas do Android , e as verificações de comprimento são uma maneira rápida de filtrar a maioria das incompatibilidades.
Código fonte:
fonte
Desde a versão 3.5, o Apache Commons StringUtils possui os seguintes métodos:
Eles fornecem comparação de nula segura e segura.
fonte
Usando o Java 8:
fonte
Compare duas cadeias usando o método equals (-, -) e equalsIgnoreCase (-, -) da classe Apache Commons StringUtils.
StringUtils.equals (-, -) :
StringUtils.equalsIgnoreCase (-, -) :
fonte
Você pode usar da
java.util.Objects
seguinte maneira.fonte
é isso que você deseja?
fonte
false
se as duas Strings foremnull
que podem não ser o resultado desejado.fonte
fonte
OK, então o que significa "melhor solução possível"?
Se você quer dizer mais legível, todas as soluções possíveis são praticamente equivalentes para um programador Java experiente. Mas o IMO, o mais legível é esse
Em outras palavras, oculte a implementação dentro de um método simples que (idealmente) possa ser incorporado.
(Você também pode "terceirizar" uma biblioteca de utilitários de terceiros ... se você já a usa na sua base de código.)
Se você quer dizer o melhor desempenho, então:
null
argumentos,fonte