2 duvidas sobre hashCode()

11 respostas
evertonsilvagomesjav
1º Dúvida: Quando eu tenho um metodo hashCode() assim eu entendo
public int hashCode(){

return this.nome.hashCode(); // aqui ele vai calcular o hash da string nome ok.

}

Agora quando eu tenho um método assim por exemplo:

public int hashCode(){

return 5; // da onde ele tira hashing aqui pra saber se tem variaveis com hash igual ou nao?

}

2º Dúvida:

Se o método equals() retornar false, o hashCode() pode ser true? Se sim quando?

11 Respostas

sergiotaborda
evertonsilvagomesjava:
1º Dúvida: Quando eu tenho um metodo hashCode() assim eu entendo
public int hashCode(){

return this.nome.hashCode(); // aqui ele vai calcular o hash da string nome ok.

}

Agora quando eu tenho um método assim por exemplo:

public int hashCode(){

return 5; // da onde ele tira hashing aqui pra saber se tem variaveis com hash igual ou nao?

}

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

quando vc faz

public int hashCode() {
  return 5;
}

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:

public int hashCode(){

return 5; // todos os objetos obtem por exemplo o mesmo hash? Ai fica dependendo do equals()...?

}
V

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:

public int hashCode(){   
  
return 5; // 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

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

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:

http://en.wikipedia.org/wiki/Hash_table

Criado 19 de janeiro de 2010
Ultima resposta 19 de jan. de 2010
Respostas 11
Participantes 4