Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida sobre características do HashCode e HashSet

Ok, a princípio eu fiquei um pouco assustado com a aula porém, depois de dar uma lida em outros artigos na internet e alguns testes, a conclusão que eu cheguei foi:

  • Sempre que eu for sobrescrever o Equals, sobrescrever também o Hashcode por segurança. Ambos devem se basear nas mesmas regras.

  • O Hashcode padrão (lá da classe Object) gera um número baseado na memória (referencia do Objeto), mesma regra para se basear no método Equals da mesma classe.

  • Considerando as duas afirmativas anteriores, na minha classe (nesse caso "Aluno"), depois de sobrescrever o Equals eu preciso sobrescrever o método Hashcode e fazer com que ele gere um número baseado nos meus atributos, selecionados em minha escolha (Os mesmos que escolhi quando sobrescrevi o Equals). Exemplo: nesse caso, o que define se um aluno é igual a outro aluno é o nome dele. Logo, o hashcode deve se basear no nome.

  • Enfim após alguns testes, me parece que por baixo dos panos, o Contains da classe HashSet utiliza tanto o Equals e o Hashcode que pertencem ao tipo de objeto do Conjunto. (Exemplo: um HashSet de String usa o Equals e Hashcode da Classe String, Um HashSet de Integer usa o Equals e Hashcode da Classe Integer). Em um ArrayList por exemplo, não me preocupo com o Hashcode porque eu simplesmente saio pela lista inteira comparando apenas o conteúdo (Equals) e não considero o Hashcode.

É +- por aí?

Agora, isso me deixa somente com uma dúvida bem simples até: Se eu quiser utilizar o equals com mais de um critério, como que eu construiria o meu Hashcode? Utilizaria o método "Objects.hash(condicao1, condicao2, condicaoN)"?

Acho que na semana passada alguém já falou disto: https://cursos.alura.com.br/forum/topico-e-se-eu-quisesse-utilizar-mais-criterios-no-equals-117437

Obrigado.

2 respostas
solução!

Fala, Arthur! Tudo bem contigo?

É bem por aí sim! ;-)

Sempre sobreponha hashCode ao sobrepor equals! Tanto é que as IDEs como Eclipse, Intellij ou Netbeans sempre colocam juntas quando utilizamos as Wizards delas.

No livro Java Efetivo de Joshua Bloch ele faz uma explicação sobre HashCode. Segue abaixo um pequeno trecho:

  • Uma fonte comum de erros é a não sobreposição do método hashCode. Você deve sobrepor hashCode em toda classe que sobrepuser equals. Se isso não for feito, resultará em uma violação do contrato geral de Object.hashCode, que impedirá sua classe de funcionar apropriadamente junto com todas as coleções baseadas em hash, inclusive *HashMap, HashSet e Hashtable.

Aconselho ler esse livro! Trata vários assuntos sobre "pequenas regras" do mundo Java.

A explicação no link que postou traz um exemplo muito bom sobre sua questão, Arthur!!!

Agradecemos a postagem por contribuir com a comunidade, pois assuntos como hashCode é algo que sempre gera bons assuntos ;-)

Um abraço e bons estudos, Arthur!!!

Obrigado, Cássio!