Eu queria esclarecer se entendi isso corretamente:
==
é uma comparação de referência, ou seja, os dois objetos apontam para o mesmo local de memória.equals()
avalia para a comparação de valores nos objetos
java
identity
equality
object-comparison
brainydexter
fonte
fonte
.equals()
que isso é equivalenteRespostas:
Em geral, a resposta para sua pergunta é "sim", mas ...
.equals(...)
só comparará o que está escrito para comparar, nem mais, nem menos.equals(Object o)
método da classe pai mais próxima que substituiu esse método.Object#equals(Object o)
método. De acordo com a API de objetos, é o mesmo que==
; isto é, retornará true se e somente se as duas variáveis se referirem ao mesmo objeto, se suas referências forem uma e a mesma. Assim, você testará a igualdade de objetos e não a funcional .hashCode
se sempre de substituir se você substituirequals
para não "quebrar o contrato". De acordo com a API, o resultado retornado dohashCode()
método para dois objetos deve ser o mesmo se seusequals
métodos mostrarem que são equivalentes. O inverso não é necessariamente verdadeiro.fonte
==
verifica a referência de memória, por que estou recebendo esse comportamento estranho em [this] [1] [1]: docs.google.com/document/d/… Esperava que a saída fosse verdadeira. pode limpar minhas confusõesThe equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
<br/>Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
( docs.oracle.com/javase/7/docs/api/java/lang/… )Com relação à classe String:
O método equals () compara o "valor" dentro das instâncias de String (na pilha), independentemente se as duas referências de objeto se referirem à mesma instância de String ou não. Se quaisquer duas referências de objeto do tipo String se referirem à mesma instância de String, então ótimo! Se as duas referências de objeto se referirem a duas instâncias diferentes de String ... isso não faz diferença. É o "valor" (ou seja: o conteúdo da matriz de caracteres) dentro de cada instância String que está sendo comparada.
Por outro lado, o operador "==" compara o valor de duas referências a objetos para verificar se elas se referem à mesma instância String . Se o valor das duas referências de objeto "se referirem" à mesma instância String, o resultado da expressão booleana seria "true" .. duh. Se, por outro lado, o valor de ambas as referências a objetos "se referirem" a diferentes instâncias de String (mesmo que ambas as instâncias tenham "valores" idênticos, ou seja, o conteúdo das matrizes de caracteres de cada instância de String é o mesmo), O resultado da expressão booleana seria "false".
Como em qualquer explicação, deixe-a afundar.
Espero que isso esclareça um pouco as coisas.
fonte
String
s, também==
é igual a referência, sim, mas geralmente funciona (como em doisString
s com o mesmo conteúdo geralmente será==
um para o outro), devido à maneira como o Java lida comString
s. Nem sempre, e certamente é uma prática ruim, mas é um erro comum, principalmente de pessoas provenientes de outros idiomas.String
build from string literal será adicionado a algo chamado deString constant pool
, por exemplo,String s1 = "someString"; String s2 = "someString;"
amboss1
&s2
compartilharão a mesma referência.s1 == s2
retornará verdadeiro. Mas se eles foram construídos viaString constructor
, por exemploString s1 = new String("someString"); String s2 = new String("someString");
, eles não compartilharão a mesma referência.s1 == s2
retornará falso.Existem algumas pequenas diferenças, dependendo se você está falando de "primitivas" ou "Tipos de objetos"; o mesmo pode ser dito se você estiver falando sobre membros "estáticos" ou "não estáticos"; você também pode misturar todos os itens acima ...
Aqui está um exemplo (você pode executá-lo):
Você pode comparar as explicações para "==" (Operador de igualdade) e ".equals (...)" (método na classe java.lang.Object) através destes links:
fonte
A diferença entre == e igual me confundiu por algum tempo, até que decidi dar uma olhada mais de perto. Muitos deles dizem que para comparar strings você deve usar
equals
e não==
. Espero que nesta resposta eu seja capaz de dizer a diferença.A melhor maneira de responder a essa pergunta é fazer algumas perguntas para si mesmo. então vamos começar:
Qual é o resultado do programa abaixo:
Se você diz,
Eu vou dizer que você está certo, mas por que você disse isso ? e Se você diz que a saída é,
Eu vou dizer que você está errado, mas ainda vou perguntar, por que você acha isso certo?
Ok, vamos tentar responder a este:
Qual é o resultado do programa abaixo:
Agora, se você diz,
Eu vou dizer que você está errado, mas por que está errado agora ? a saída correta para este programa é
Por favor, compare o programa acima e tente pensar sobre isso.
Está bem. Agora isso pode ajudar (leia isto: imprima o endereço do objeto - não é possível, mas ainda podemos usá-lo.)
você pode apenas tentar pensar na saída das últimas três linhas no código acima: para mim, o ideone imprimiu isso ( você pode verificar o código aqui ):
Oh! Agora você vê que identityHashCode (manga) é igual a identityHashCode (mango2), mas não é igual a identityHashCode (mango3)
Mesmo que todas as variáveis de string - manga, manga2 e manga3 - tenham o mesmo valor, que é "manga",
identityHashCode()
ainda não são as mesmas para todos.Agora tente descomentar esta linha
// mango2 = "mang";
e executá-la novamente desta vez, para ver todas as trêsidentityHashCode()
diferentes. Hmm, que é uma dica útilsabemos que se
hashcode(x)=N
ehashcode(y)=N
=>x is equal to y
Não tenho certeza de como o java funciona internamente, mas presumo que foi o que aconteceu quando eu disse:
java criou uma string
"mango"
que foi apontada (referenciada) pela variávelmango
algo como istoAgora, na próxima linha, quando eu disse:
Na verdade, reutilizou a mesma string
"mango"
que se parece com issoMango e mango2 apontando para a mesma referência Agora, quando eu disse
Na verdade, ele criou uma referência completamente nova (string) para "manga". que se parece com isso,
e é por isso que quando eu coloco os valores para
mango == mango2
, ele colocatrue
. e quando eu coloco o valor paramango3 == mango2
, ele colocafalse
(mesmo quando os valores eram os mesmos).e quando você descomentou a linha,
// mango2 = "mang";
na verdade, ele criou uma string "mang" que virou nosso gráfico assim:É por isso que o identityHashCode não é o mesmo para todos.
Espero que isso ajude vocês. Na verdade, eu queria gerar um caso de teste em que == falha e equals () passa. Por favor, sinta-se livre para comentar e me avise se eu estiver errado.
fonte
mango == mango2
acontece porque você não crioumango2
como um novo objeto String e apenas referenciou diretamente"mango"
?Felicidades :-)
fonte
Você precisará substituir a função equals (junto com outras) para usá-la com classes personalizadas.
O método equals compara os objetos.
O
==
operador binário compara os endereços de memória.fonte
Ambos == e .equals () se referem ao mesmo objeto se você não substituir .equals ().
É seu desejo o que você quer fazer depois de substituir .equals (). Você pode comparar o estado do objeto que está chamando com o estado passado no objeto ou pode simplesmente chamar super.equals ()
fonte
==
é um operador eequals()
é um método .Os operadores geralmente são usados para comparações de tipos primitivos e, portanto,
==
são usados para comparação de endereços de memória e oequals()
método é usado para comparar objetos .fonte
fonte
Lembre-se de que isso
.equals(...)
deve ser implementado pela classe que você está tentando comparar. Caso contrário, não há muito sentido; a versão do método para a classe Object faz o mesmo que a operação de comparação: Object # equals .A única vez em que você realmente deseja usar o operador de comparação para objetos é quando você está comparando Enums. Isso ocorre porque há apenas uma instância de um valor Enum por vez. Por exemplo, dado o enum
Você nunca terá mais de uma instância de
A
cada vez, e o mesmo paraB
eC
. Isso significa que você pode realmente escrever um método como este:E você não terá nenhum problema.
fonte
Quando você avalia o código, fica muito claro que (==) compara de acordo com o endereço da memória, enquanto igual (Objeto o) compara hashCode () das instâncias. É por isso que se diz que não quebre o contrato entre equals () e hashCode () se você não enfrentar surpresas mais tarde.
fonte
Aqui está uma regra geral para a diferença entre
relational operator ==
ethe method .equals()
.object1 == object2
compara se os objetos referenciados por objeto1 e objeto2 se referem ao mesmo local de memória no Heap .object1.equals(object2)
compara os valores de objeto1 e objeto2, independentemente de onde eles estão localizados na memória .Isso pode ser demonstrado bem usando String
Cenário 1
Cenário 2
Essa comparação de cadeias poderia ser usada como base para comparar outros tipos de objetos.
Por exemplo, se eu tiver uma classe Person , preciso definir a base de critérios com a qual compararei duas pessoas . Digamos que essa classe de pessoa tenha variáveis de instância de altura e peso.
Portanto, para criar objetos person
person1 and person2
e comparar esses dois usando o.equals()
, preciso substituir o método equals da classe person para definir com base em quais variáveis de instância (altura ou peso) a comparação será.No entanto, o
== operator will still return results based on the memory location of the two objects(person1 and person2)
.Para facilitar a generalização dessa comparação de objetos pessoais, criei a seguinte classe de teste. Experimentar esses conceitos revelará toneladas de fatos .
O resultado desta execução de classe é:
fonte
Observe também que
.equals()
normalmente contém==
para teste, pois esta é a primeira coisa que você deseja testar se quiser testar se dois objetos são iguais.E,
==
na verdade, analisa valores para tipos primitivos, para objetos que verifica a referência.fonte
== operador sempre a referência é comparada. Mas no caso de
depende da implementação se formos substituídos pelo método equals do que comparar o objeto com base na implementação dada no método substituído.
no código acima, obj e obj1 contêm os mesmos dados, mas a referência não é a mesma; portanto, igual a return false e == also. mas se substituímos o método é igual a
sabe check-out ele retornará verdadeiro e falso para o mesmo caso, apenas nós substituímos
compara objeto no básico do conteúdo (id) do objeto
ainda compara referências de objeto.
fonte
A principal diferença entre == e igual a () é
1) == é usado para comparar primitivas.
Por exemplo :
2) equals () é usado para comparar objetos. Por exemplo :
fonte
==
pode ser usado em muitos tipos de objetos, mas você pode usarObject.equals
para qualquer tipo, especialmente Strings e Google Map Markers.fonte
---- Saída ----- verdadeiro falso verdadeiro
fonte
Vale a pena acrescentar que, para objetos wrapper para tipos primitivos - por exemplo, Int, Long, Double - == retornará true se os dois valores forem iguais.
Por outro lado, colocando os dois Longs acima em dois ArrayLists separados, iguais os vê como iguais, mas == não.
fonte
Long a = 128l; Long b = 128l; System.out.println(a == b);
O pool de String (também conhecido como interno ) e o pool de números inteiros diminuem ainda mais a diferença e podem permitir que você use
==
objetos em alguns casos, em vez de.equals
Isso pode lhe proporcionar melhor desempenho (?), Ao custo de maior complexidade.
Por exemplo:
Troca de complexidade: o seguinte pode surpreendê-lo:
Aconselho que você fique longe dessa micro-otimização e sempre use
.equals
para objetos e==
para primitivas:fonte
Em suma, a resposta é "Sim".
Em Java, o
==
operador compara os dois objetos para ver se eles apontam para o mesmo local de memória; enquanto o.equals()
método realmente compara os dois objetos para ver se eles têm o mesmo valor.fonte
Basicamente,
==
compara se dois objetos têm a mesma referência na pilha, portanto, a menos que duas referências estejam vinculadas ao mesmo objeto, essa comparação será falsa.equals()
é um método herdado daObject
classe Esse método, por padrão, compara se dois objetos têm a mesma referência. Isso significa:object1.equals(object2)
<=>object1 == object2
No entanto, se você deseja estabelecer a igualdade entre dois objetos da mesma classe, substitua esse método. Também é muito importante substituir o método
hashCode()
se você tiver substituídoequals()
.Implementar
hashCode()
ao estabelecer a igualdade faz parte do Java Object Contract. Se você estiver trabalhando com coleções e não tiver implementadohashCode()
, Strange Bad Things pode acontecer:null
será impresso após a execução do código anterior, se você não tiver implementadohashCode()
.fonte
Como o Java não suporta sobrecarga do operador, == se comporta de maneira idêntica para todos os objetos, mas equals () é o método, que pode ser substituído em Java e a lógica para comparar objetos pode ser alterada com base nas regras de negócios.
A principal diferença entre == e igual em Java é que "==" é usado para comparar primitivas, enquanto o método equals () é recomendado para verificar a igualdade de objetos.
A comparação de cadeias é um cenário comum de uso dos métodos == e igual. Como a classe java.lang.String substitui o método equals, ele retornará true se dois objetos String contiverem o mesmo conteúdo, mas == só retornará true se duas referências estiverem apontando para o mesmo objeto.
Aqui está um exemplo de comparação de duas Strings em Java para igualdade usando o método == e equals (), que esclarecerá algumas dúvidas:
fonte