estou estudando e o livro fala que se eu nao sobreescrever o metodo equals, eu não posso usar um objeto como chave em uma tabela hashing (Livro da Kathy Sierra, pagina 303), porem eu nao entendi o porque. Alguem pode me explicar ? Se eu não sobreescrever esse metodo, caso eu tenha dois objetos e coloque os dois em uma tabala hashing (HashMap ???), um sobreescreve o outro ?
Para tentar entender eu criei os seguintes codigos:
class Teste {
private String nome;
Teste(String nome) {
this.nome = nome;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Teste) {
Teste testeAux = (Teste) obj;
if (testeAux.nome.equals(this.nome)) {
return true;
} else {
return false;
}
}
return false;
}
}
O HashMap é formado por Map.Entry’s, que seguram uma chave e um valor. Quando chamamos o método put, passamos uma chave e um valor. Se a chave ainda não estiver no mapa, é criado um novo Entry com a chave e o valor passado. Caso a chave já esteja no mapa, o valor antigo que estava associado a chave é reposto pelo novo valor que está sendo passado no parâmetro. E para verificar se a chave já existe, é considerado seu hashCode e o método equals (não tenho certeza absoluta se o método equals é considerado, mas acho que é).
Quando se implementa o método equals, é importante que se implemente o método hashCode também. Tem um tópico que o ViniGodoy dá uma excelente explicação sobre o hash code e como gerá-lo corretamente, se eu achar eu posto o link aqui.
Não sei se você já leu o trecho que ela fala sobre hashCode mas você vai notar que em algum momento ela fala que se você não sobrescrever equals e hashCode você vai ter elementos duplicados em tabelas hash. Eu duvidei dela quando li e testei XD, ela disse a verdade, como não conheço como o método hashCode é implementado em Object então não sei dizer porque é preciso sobrescrever tal método além de equals …“deve ser porque ele não procura no bucket correto”
Voltando ao porque sobrescrever equals é porque em tabelas de espalhamento é preciso do hashCode para saber em qual bucket está o elemento a ser retornado, mas também, é preciso uma forma de saber se dado um elemento tal elemento é equivalentemente igual à algum elemento daquele bucket
Imagine vários sacos cada um com vários brinquedos dentro, cada saco é referenciado por um número(hashCode). Agora imagine que você precise de um brinquedo de saco específico, você sabe em qual saco o brinquedo está porque você tem o número do saco, mas, como você vai saber qual brinquedo dentro de tal saco é aquele que você precisa? equals está ai para te ajudar =)
Pra mim a explicação parece clara mas é preciso que você leia sobre hashCode para ficar mais claro
A implementação de equals e hashCode de Object consideram a referência do objeto. Portanto se o método equals for implementado para verificar o conteúdo do objeto, hashCode também deve ser implementado para gerar o número de acordo com o conteúdo do objeto.
Valeu Eric, vou ler (amanha e sem estar com sono) !!
mapleplayer, se eu só sobreescrever o equal vou ter elementos duplicados? se eu sobreescrever só o hashcode eu tambem vou ter elementos duplicados ?
Tem mais alguma implicação se eu só sobreescrever um desses metodos e nao sobreescrever o outro ? (Caso a resposta estaja em um dos links…desculpe).
Se você sobrescrever apenas um dos dois então você terá elementos duplicados em tabelas hash, é preciso sobrescrever os dois para funcionar como o esperado