Eu sei disso ==
tem alguns problemas ao comparar dois Strings
. Parece que String.equals()
é uma abordagem melhor. Bem, eu estou fazendo o teste JUnit e minha inclinação é usar assertEquals(str1, str2)
. Essa é uma maneira confiável de afirmar que duas seqüências contêm o mesmo conteúdo? Eu usaria assertTrue(str1.equals(str2))
, mas você não terá o benefício de ver quais são os valores reais e esperados em caso de falha.
Em uma nota relacionada, alguém tem um link para uma página ou tópico que explique claramente os problemas com str1 == str2
?
Respostas:
Você sempre deve usar
.equals()
ao compararStrings
em Java.JUnit chama o
.equals()
método para determinar a igualdade no métodoassertEquals(Object o1, Object o2)
.Então, você está definitivamente seguro de usar
assertEquals(string1, string2)
. (PorqueString
s sãoObject
s)Aqui está um link para uma ótima pergunta sobre o Stackoverflow sobre algumas das diferenças entre
==
e.equals()
.fonte
assertEquals
usa oequals
método para comparação. Há uma afirmação diferenteassertSame
, que usa o==
operador.Para entender por
==
que não deve ser usado com strings, você precisa entender o que==
faz: faz uma verificação de identidade. Ou seja,a == b
verifica sea
e seb
refere ao mesmo objeto . Ele está embutido no idioma e seu comportamento não pode ser alterado por diferentes classes. Oequals
método, por outro lado, pode ser substituído por classes. Embora seu comportamento padrão (naObject
classe) seja fazer uma verificação de identidade usando o==
operador, muitas classes, inclusiveString
, substituem-na para fazer uma verificação de "equivalência". No caso deString
, em vez de verificar sea
e seb
referir ao mesmo objeto,a.equals(b)
verifica se os objetos a que se referem são as duas cadeias que contêm exatamente os mesmos caracteres.Tempo da analogia: imagine que cada
String
objeto seja um pedaço de papel com algo escrito nele. Digamos que eu tenha dois pedaços de papel com "Foo" escrito neles e outro com "Bar" escrito. Se eu pegar os dois primeiros pedaços de papel e utilizá==
-los para compará-los, ele retornaráfalse
porque está essencialmente perguntando "estes são o mesmo pedaço de papel?". Nem precisa olhar para o que está escrito no papel. O fato de eu estar entregando dois pedaços de papel (em vez do mesmo duas vezes) significa que ele retornaráfalse
. Se eu usarequals
, no entanto, oequals
método lerá os dois pedaços de papel e verá que eles dizem a mesma coisa ("Foo"), e assim retornarátrue
.O pouco que se confunde com Strings é que o Java tem um conceito de "internar" Strings, e isso é (efetivamente) executado automaticamente em qualquer literal de string em seu código. Isso significa que, se você tiver dois literais de string equivalentes em seu código (mesmo que estejam em classes diferentes), eles na verdade se referem ao mesmo
String
objeto. Isso faz com que o==
operador retorne comtrue
mais frequência do que se poderia esperar.fonte
Em poucas palavras - você pode ter dois objetos String que contêm os mesmos caracteres, mas são objetos diferentes (em diferentes locais de memória). O operador == verifica se duas referências estão apontando para o mesmo objeto (local da memória), mas o método equals () verifica se os caracteres são os mesmos.
Normalmente, você está interessado em verificar se duas Strings contêm os mesmos caracteres, não se apontam para o mesmo local de memória.
fonte
fonte
Sim, é usado o tempo todo para testes. É muito provável que a estrutura de teste use .equals () para comparações como essas.
Abaixo está um link que explica o "erro de igualdade de string". Essencialmente, as seqüências de caracteres em Java são objetos e, quando você compara a igualdade de objetos, geralmente elas são comparadas com base no endereço da memória e não pelo conteúdo. Por esse motivo, duas cadeias não ocupam o mesmo endereço, mesmo que seu conteúdo seja idêntico; portanto, elas não corresponderão corretamente, mesmo que tenham a mesma aparência quando impressas.
http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
fonte
O JUnit
assertEquals(obj1, obj2)
realmente chamaobj1.equals(obj2)
.Há também o
assertSame(obj1, obj2)
que fazobj1 == obj2
(ou seja, verifica issoobj1
eobj2
faz referência à mesma instância), que é o que você está tentando evitar.Então você está bem.
fonte
http://leepoint.net/notes-java/data/strings/12stringcomparison.html
String
é umObject
em java, então se enquadra nessa categoria de regras de comparação.fonte