java - hashCode() e equals() - porque devo sobrescrever os dois?
Perguntas � java � hashCode() e equals() - porque devo sobrescrever os dois?
hashCode() e equals() - porque devo sobrescrever os dois?
Estou estudando a fundo sobre a API Collections do Java, e em relação a implementação HashSet me surgiu uma dúvida em relação ao seu funcionamento interno, por exemplo:
Se eu tenho uma classe Conta com os atributos código, titular e saldo, e eu for colocar as instancias desta classe dentro de um HashSet, para que ele saiba definir se os métodos são iguais, eu devo sobrescrever os métodos hashCode() e equals(), levando em consideração o atributo código, por exemplo.
Agora, porque eu devo sobrescrever o hashCode()? Uma vez que o equals() já não seria o suficiente para definir se o meu objeto é igual ou não a outro que há nesta lista?
Se eu remover o método o hashCode() e deixar só o equals, ele permite que haja repetição no meu HashSet, porque ele não consegue comparar se o objeto já existe, uma vez que está definido o método equals()?
criado 28 de dez de 2014
editado 28 de dez de 2014
Pessoal, acho que já entendi.
Quando vou adicionar um objeto ao meu HashSet, ele primeiro verifica pelo método hashCode() quais elementos tem o mesmo hashCode() que do objeto que estou tentando adicionar, a partir daí, os objetos que ele encontrar, ele vai guardar em um grupo para não ter que percorrer todos os elementos da lista. A partir deste grupo ele irá testando com o método equals() se o objeto é igual e se for, não adiciona o objeto no HashSet, ou seja, se eu não implementar o métodoi hashCode() a lista que ele for percorrer para comparar com o comando equals() será vazia, logo é como se o objeto não existisse.
Tem uma dependência cronológica entre os dois métodos, antes de utilizar o equals() é preciso criar um grupo de elementos baseados no que for retornado pelo hashCode().
criado 29 de dez de 2014
Não há necessidade de sobrescreve-los, porém em alguns lugares vc irá usa-los, são eles o toString() o hashCode() e o equals(). O toString vc usa muito para retornar o que precisa referente ao objeto para usar em combobox por exemplo. O equals vc usa como exemplo no JSF para fazer parser de objetos tbm em componentes do tipo select. O hashCode usa-se para fazer pesquisas em um conjunto, eh como se fosse um indexador do objeto. Os 3 metodos nao ha necessidade de serem reescritos, mas uma hora ou outra vc irá usá-los para algum trabalho.
— fernandopaiva 29 de dez de 2014
É exatamente o que você falou, Dias. Como dois objetos diferentes podem ter hashcodes iguais, os objetos que trabalham com o hash são obrigados a recorrer ao equals quando detectam algum tipo de colisão.
— ViniGodoy 29 de dez de 2014
Legal pessoal, ficou esclarecido. Obrigado!
— Dias 30 de dez de 2014
Não é a resposta que estava procurando? Procure outras perguntas com as tags java collections hash ou faça a sua própria pergunta.