Hashcode() e equals()

4 respostas
Daniel_Reis

Boa tarde e bom carnaval a todos, apesar de aqui na Bahia a folia está pegando “fogo”, estou aqui nos meus estudos… rs

Pessoas, seguinte, dei uma lida nos posts referentes a equals and hashcode, mas me restam algumas dúvidas…

Vamos lá, estando no eclipse solicitei uma sobrescrita automática dos dois métodos, usando como parâmetro o atributo número, ele me gerou:

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + numero;
		return result;
	}

	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Conta other = (Conta) obj;
		if (numero != other.numero)
			return false;
		return true;
	}

1ª) O método equals() chama implicitamente o método hashcode, correto?
2ª) final int prime = 31; e int result = 1; Esse valor 31 e 1, são aleatórios? Se não, são baseados em que?
3ª) Como provocar uma inconsistência na comparação para que o equals() erre e o hashcode() salve a comparação? Essa é a intenção, correto?
4ª) Nesse exemplo acima mesmo removendo hashcode(), o equals() funciona sem problemas, tem algo errado?

Obrigado a todos…
Daniel Reis

4 Respostas

ViniGodoy

Não. As vezes ele pode chamar explicitamente o método hashcode, mas é muito raro.
Nesse caso, ele não faz isso.

São aleatórios e preferencialmente primos. Você pode ver uma explicação detalhada nesse link.
http://developer.java.sun.com/developer/Books/effectivejava/Chapter3.pdf
Recomendo FORTEMENTE a leitura dos itens que tratam de hashcode e equals.

Salve a comparação? Não entendi o que você quis dizer…

Mas é fácil provocar uma inconsistência de equals e hashcode. Basta acrescentar no hash um campo que não está sendo comparado no equals. Isso pode fazer com que dois objetos considerados iguais tenham hashs diferentes. E isso prejudicaria muito estruturas baseadas em hashs, como o HashSet.

Há mais exemplos no link ali de cima.

Não, ele vai usar a implementação padrão, herdada de object.

Novamente, não deixe de ler o link ali de cima. É uma das melhores referências no assunto.

Daniel_Reis

3ª) Como provocar uma inconsistência na comparação para que o equals() erre e o hashcode() salve a comparação? Essa é a intenção, correto?

Salve a comparação? Não entendi o que você quis dizer…

Quis dizer que se por acaso o equals() errar o hascode() poderia salvar a comparação.

ViniGodoy, obrigado pelas respostas… vou sim ler o link q vc me passou, se tiver mais algum material, eu agradeço.

Obrigado,
Daniel Reis

ViniGodoy

Não, infelizmente a idéia não é essa. A regra é simples:
Objetos iguais tem, necessariamente, hashcodes iguais.

Mas o contrário não é valido. Objetos diferentes também podem ter hashcodes iguais. O ideal é que isso seja improvável, mas não há garantias de que isso nunca ocorra.

Dê uma olhada nesse link também, pode te ajudar:
http://www.guj.com.br/posts/list/52485.java

Daniel_Reis

Obrigado, ViniGodoy … :thumbup:

Criado 5 de fevereiro de 2008
Ultima resposta 6 de fev. de 2008
Respostas 4
Participantes 2