Não tira. Não existe nenhuma regra dizendo quem hash deve ser calculado com base nos campos.
Uma constante é um hash válido.
2º Dúvida:
Se o método equals() retornar false, o hashCode() pode ser true? Se sim quando?
hashCode retorna inteiros portanto nunca pode returnar true nem false.
V
vmsb11
quando vc faz
publicinthashCode(){
return5;
}
vc ta dizendo que vai amarzenar todos os seus objetos na msm caixa, ai vai depender se o método equals estiver implementado corretamente para impedir que 2 objetos iguais sejam inseridos num conjunto
o método hashcode retorna um inteiro…
evertonsilvagomesjav
deixa eu explicar melhor, se o método equals retornar false, o operador de == de comparaçao de hashCode() pode ser true?
vmsb acho que entendi, entao quando fazemos:
publicinthashCode(){
return5; // todos os objetos obtem por exemplo o mesmo hash? Ai fica dependendo do equals()...?
}
V
vmsb11
pode ser verdadeiro sim…mas só será verdadeiro se os contratos de hashcode e equals não tiverem sido implementados corretamente…
evertonsilvagomesjav
então quando fizermos:
publicinthashCode(){return5; // todos os objetos obtem por exemplo o mesmo hash? Ai fica dependendo do equals()...?
}
é isso mesmo?
sergiotaborda
evertonsilvagomesjava:
deixa eu explicar melhor, se o método equals retornar false, o operador de == de comparaçao de hashCode() pode ser true?
A regra é simples
Se X.equals(Y) então X.hashCode() == Y.hashcode();
A relação matemática “então” não é inversivel. Portanto,
Se X.equals(Y) é falso, nada pode ser dito do hashCode. Ele pode ser qq , não importa.
Se X.hashCode() == Y.hashcode() , nada pode ser dito do equals. É por isto que uma constante funciona.
Os hash que estão de acordo com a regra, são válidos. Se são eficientes é outro problema.
Usar constante sempre é válido, mas não é eficiente.
V
vmsb11
isso msm…
evertonsilvagomesjav
mas pra ter um x.equals(y) ser true e x.hashCode() == y.hashCode() ser false, o hash tem que ta implementado de forma errada digamos assim seria isso né?
sergiotaborda
Se a relação não se verifica pode ser culpa tanto do equals como do hashCode. E não é tão dificil, basta que vc use um campo diferente para comparção em cada um. Ou não trate os null corretamente.
evertonsilvagomesjav
hum cara, vlw ai sergio e vmsb!!!
R
roger_rf
Complementando um pouco a discussão: um dos grandes objetivos do hash code é permitir que testes de igualdade sejam realizados com rapidez. Isso, por sua vez, facilita a construção de tabelas de dispersão, as famosas hash tables: