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