Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Estou com dúvida no curso de Aprimorando a Orientação a Objetos com Java, no exercício 80 do capítulo Melhorando a coesão de nossas classes.

contrato: dois objetos considerados iguais devem gerar hashCodes iguais.

Porque seguir esse contrato ?

Qual a vantagem do seu uso ?

E se eu não usar ?

1 resposta
solução!

Se você utilizar uma coleção que não permita repetição de elementos você deve implementar o equals() e hashCode() para definir qual critério que dirá que um objeto é único.

Quando adicionamos elementos a uma coleção do tipo HashMap devemos informar a chave e o conteúdo que será associado a chave. Um elemento desse HashMap é considerado único pela sua chave, ele não permite chaves duplicadas, mas diferentes de outros tipos de coleções que simplesmente não permitam objetos considerados iguais/duplicados a serem adicionados, o HashMap escreve o conteúdo do objeto da chave "repetida" que você está inserindo, ele sobreescreve o conteúdo, não a chave!

    //chave   //conteúdo
Map <Integer, String>     map = new HashMap<Integer, String>();
        map.put(1, "teste");
        map.put(2, "qwerty");
        map.put(3, "asdfg");
        map.put(1, "Inseri outro objeto com chave igual a 1 mas o conteúdo é diferente " +
                   "então o HashMap 'sobreescreve' somente o conteúdo não muda a chave, " + 
                   "como a classe Integer implementa o método hashCode() e equals(), o HashMap 'sabe' " +
                   "se a chave será considerada repetida ou não.");

O HashMap usa uma tabela hash para armazenar seus elementos e poder fazer esse "esquema" de "sobreescrever conteúdo", você precisa implementar o método hashcode() junto com o equals() para definir qual será o critério para a chave, Numa classe conta por exemplo pode ser o número da conta.

Acho que não existe vantagem ou desvantagem depende do contexto do problema que vc quer resolver, cada tipo de coleção é recomendada para determinada situação... o HashMap pra essa situação: se vc quiser armazenar chaves e valores e quiser "atualizar" seus conteúdos. Outras coleções simplesmente não deixam isso acontecer "barram" a inserção só por causa da chave.

Se vc tiver um HashMap que usa como chave um objeto de uma classe sua que não implementa o equals e hashcode vc não está declarando o critério para esse "esquema" de verificação de chave duplicada, o que acontece se vc fizer isso? faça o teste, creio que não dará certo