Como comparar dois objects java

Eu tenho dois objects java que são instanciados da mesma class.

MyClass myClass1 = new MyClass(); MyClass myClass2 = new MyClass(); 

Se eu definir suas propriedades com os mesmos valores e, em seguida, verifique se eles são os mesmos

 if(myClass1 == myClass2){ // objects match ... } if(myClass1.equals(myClass2)){ // objects match ... } 

No entanto, nenhuma dessas abordagens retorna um valor verdadeiro. Eu verifiquei as propriedades de cada uma e elas correspondem.

Como faço para comparar esses dois objects para verificar se eles são idênticos?

   

Você precisa fornecer sua própria implementação de equals() no MyClass .

 @Override public boolean equals(Object other) { if (!(other instanceof MyClass)) { return false; } MyClass that = (MyClass) other; // Custom equality check here. return this.field1.equals(that.field1) && this.field2.equals(that.field2); } 

Você também deve replace o hashCode() se houver alguma chance de seus objects serem usados ​​em uma tabela de hash. Uma implementação razoável seria combinar os códigos hash dos campos do object com algo como:

 @Override public int hashCode() { int hashCode = 1; hashCode = hashCode * 37 + this.field1.hashCode(); hashCode = hashCode * 37 + this.field2.hashCode(); return hashCode; } 

Veja esta questão para mais detalhes sobre a implementação de uma function hash.

Você precisa replace equals e hashCode .
equals compararão os objects por igualdade de acordo com as propriedades que você precisa e o hashCode é obrigatório para que seus objects sejam usados ​​corretamente em Collections e Maps

Você precisa implementar o método equals () em seu MyClass .

A razão pela qual == não funcionou é que está verificando se eles se referem à mesma instância. Desde que você fez new para cada um, cada um é uma instância diferente.

A razão pela qual o equals() não funcionou é porque você não o implementou ainda. Eu acredito que seu comportamento padrão é o mesmo que == .

Note que você também deve implementar hashcode() se você for implementar equals() porque muitas collections java.util esperam isso.

Você precisa replace corretamente o método equals () da class Object

Edit : Eu acho que minha primeira resposta foi mal entendida, provavelmente porque eu não era muito preciso. Então decidi adicionar mais explicações.

Por que você tem que replace equals ()? Bem, porque isso está no domínio de um desenvolvedor para decidir o que significa para dois objects serem iguais. A igualdade de referência não é suficiente para a maioria dos casos.

Por exemplo, imagine que você tenha um HashMap cujas chaves são do tipo Person. Cada pessoa tem nome e endereço. Agora, você quer encontrar um bean detalhado usando a chave. O problema é que você geralmente não consegue criar uma instância com a mesma referência que a do mapa. O que você faz é criar outra instância da class Person. Claramente, operador == não funcionará aqui e você terá que usar equals ().

Mas agora chegamos a outro problema. Vamos imaginar que sua coleção é muito grande e você quer executar uma pesquisa. A implementação ingênua compararia seu object-chave com todas as instâncias em um mapa usando equals (). Isso, no entanto, seria muito expansivo. E aqui vem o hashCode (). Como outros salientaram, hashcode é um único número que não precisa ser único. O requisito importante é que sempre que equals () for verdadeiro para dois objects, hashCode () deve retornar o mesmo valor para ambos. A implicação inversa não se sustenta, o que é uma coisa boa, porque o hashcode separa nossas chaves em tipo de buckets. Temos um pequeno número de instâncias da class Person em um único intervalo. Quando executamos uma pesquisa, o algoritmo pode saltar imediatamente para um balde correto e só agora executar iguais para cada instância. Portanto, a implementação de hashCode () deve distribuir os objects da maneira mais uniforme possível entre os buckets.

Há mais um ponto. Algumas collections exigem uma implementação adequada de um método hashCode () em classs que são usadas como chaves não apenas por motivos de desempenho. Os exemplos são: HashSet e LinkedHashSet. Se eles não substituírem o hashCode (), o método padrão de Object hashCode () permitirá que vários objects que você considere “significativamente iguais” sejam adicionados ao seu conjunto “no duplicates allowed”.

Algumas das collections que usam hashCode ()

  • HashSet
  • LinkedHashSet
  • HashMap

Dê uma olhada nessas duas classs do apache commons que lhe permitirá implementar equals () e hashCode () facilmente

  • EqualsBuilder
  • HashCodeBuilder

1) == avalia a igualdade de referência neste caso
2) não estou muito certo sobre os iguais, mas por que não simplesmente replace o método de comparação e plantá-lo dentro MyClass?