Equals e hashcode afinal qual a ligação dos 2?

7 respostas
P

eu venho lendo ultimamente sobre método equals e hashcode, e por ser iniciante em java
não entendo quase nada, o que sei é que ele é usado para fazer uma comparação avaliando o valor do objeto e não o endereço,
porém se não implementar ele, ele vem com a mesma função que o ==

ja o hash code faço a mínima idéia pra que serve.

se poderem me corrigir ou acrescentar algo a mais nestas definições ficaria grato !!!

7 Respostas

T
F

Imagine o hashcode como um código único que identifica cada objeto e o método equals compara se este hashcode é igual.
Dois objetos podem ter os mesmos valores em seus atributos e não são o mesmo objeto.
Duas variáveis de referência diferentes podem referenciar o mesmo objeto, quando comparadas com serão iguais.

M

Cuidado com isso aí viu, hashCodes não devem ser únicos. É melhor ler o artigo que o thingol linkou aí pra entender pra que se usa e como eles devem ser implementados.

F

É verdade, não me expressei bem quando disse único,
porém o hashcode serve para identificar cada objeto, contendo qual o tipo e o código.
O melhor mesmo é dar uma boa lida no link acima.

L

fmad27:
Imagine o hashcode como um código único que identifica cada objeto e o método equals compara se este hashcode é igual.
Dois objetos podem ter os mesmos valores em seus atributos e não são o mesmo objeto.
Duas variáveis de referência diferentes podem referenciar o mesmo objeto, quando comparadas com serão iguais.

Ao menos nos meus códigos, o método equals nunca comparou se o hashcode é igual para dizer se um objeto é igual. Ao meu ver, uma coisa é uma coisa,
e outra coisa é outra coisa.

Como já falaram, recomendo vc ler o texto que o Thingol mandou e rever seus conceitos!

L

Hahscode serve para compara diferenca...
equals serve pra comparar igualdade...

deixa eu explicar melhor... Hash é assim... 2 objetos com hashcode diferente, por definição são diferentes... o inverso não é verdade... 2 objetos com mesmo hashcode não são necessariamente iguais... o hash usa int é feito pra ser rapido e é usado por diversas coisas em java para otimizar buscas... se vc não implementa corretamente hashCode, as primeiras coisas a falhar são as Collections.... os métodos contains, remove, removeAll, retainsAll ... entre outros, certamente vão falhar, se o hashCode não for bem implementado... pois 2 hashcode diferentes, vai fazer a collection nem testar a igualdade

equals serve para compara igualdade entre objetos.... se 2 objetos são iguais, então equals deve voltar true...

.....

Pq usar ?? por exemplo...

public class Pessoa {
   String nome;
   String cpf;
   Pessoa(String nome,String cpf) {
     this.nome = nome;
     this.cpf = cpf;
   }

//...

como java vai saber ?? quando duas pessoas são iguais para o seu aplicativo ?? ele so vai saber c vc implementar equals...

no seu equals o coerente nesse caso é vc testar c os CPFs das duas pessoas são iguais....

o hashCode como vc vai usar o CPF como padrão vc pode simplismente importar o hashCode do cpf, que tudo fica certo... assim seria + ou menos assim

//...

   public int hashCode() {
       int hash = 0;
       hash = hash + (cpf == null) ? 0 : cpf.hashCode();
       return hash;
   }
   public equals(Object o) {
       if (!(o instanceof Pessoa))
           return false;
       Pessoa other = (Pessoa)o;
       if ((this.cpf == null && other.cpf != null) || !cpf.equals(other.cpf) )
           return false;
       if (this.cpf == null && nome != null)
           reutrn nome.equals(other.nome);
       
       return true;
   }
}
ou seja... quando os CPF são nulos o hashCode são zero, mais isso não quer dizer que os objetos são iguais, posi os nomes podem ser diferentes... quando há CPF o hashCode pode denunciar rapidinho que os objetos são diferentes... sem muitos testes... é pra isso que ele serve...

o equals... faz os seguintes testes...
Se o objeto é uma Pessoa
Se os Cpf são iguais, caso exista CPF em pelomenos 1 deles...
Se os nomes são iguais, caso não haja cpf...

P

ah entendo agora, vlw pessoal muito obrgiado mesmo :slight_smile:

Criado 25 de março de 2009
Ultima resposta 26 de mar. de 2009
Respostas 7
Participantes 6