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

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 !!!

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.

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.

É 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.

[quote=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. [/quote]

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!

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…

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

//…[/code]

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

[code]//…

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;

}
}[/code]

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…

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