Quando o Hashcode é gerado?

6 respostas
S

Bom dia pessoal,

Eu tenho uma classe Cao e sobreescrevo o equals e o hashcode:

public class Cao{
	private String nome;
	private String raca;
	private int idade;

        public boolean equals(Object objCao) {
		Cao cao = (Cao) objCao;
		return getIdade() == cao.getIdade();
	}
	
	   public int hashCode() {
		return getIdade()*2;
	}

Quando eu testo, os caes com idade iguais são considerados objetos iguais e possuem um mesmo hashcode.

O resultado sai assim:

6
10  
20
10

Os hashcodes 10 correspondem a caes com idades iguais.

Agora, quando é que o hashcode é gerado?

Em que momento o java sabe que o hashcode de caes com idades iguais deve ser o mesmo?

O que eu não estou entendendo é:

Como ele sabe que deve dar o hash igual à caes com idades iguais. Qual a ordem de execução dos métodos...

Obrigado

6 Respostas

ViniGodoy

Não é que ele sabe. Ele impõe isso. Uma implementação de hashCode só será correta se objetos iguais tiverem hashs iguais. Se não for assim, o sistema tem um bug, e muitas coleções não irão funcionar como deveriam.

O hashcode é usado em classes como o HashMap e o HashSet. Essas classes irão chamar esse método automaticamente.

O funcionamento do HashMap, por exemplo, depende do hash para saber em que local será armazenado internamente o objeto, e do equals para saber se esse objeto já foi armazenado lá ou não: http://www.guj.com.br/java/243155-hashmap#1257056

S

Ainda não entendi…

quando eu uso

System.out.println(c1.hashCode()); System.out.println(c2.hashCode());

Ele me retorna os hashs, e os objetos que são iguais (seguindo o equals) ele retorna o mesmo valor.

Agora em que momento isso foi feito, já que não estou usando nenhuma coleção no momento.

ViniGodoy

Nesse caso você está chamando explicitamente o método hashCode().

E, a sua lógica mesmo diz pq objetos iguais retornam o mesmo valor. Se os dois tiverem idades iguais, a idade * 2 deles será igual.

S

AH sim, entendi bem agora.

Essa seria uma má implementação do hashcode pra esse caso?

ViniGodoy

Depende muito. Se seus dados estiverem uniformemente distribuídos pela idade, então não. Caso contrário, sim.

S

Entendo.

Obrigado pelas explicações!

vou depois dar uma olhada numa maneira de implementar o hashmap que você publicou.

abrasss

Criado 31 de maio de 2011
Ultima resposta 31 de mai. de 2011
Respostas 6
Participantes 2