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

Relação entre HashCode e equals

Primeiramente boa tarde a todos!

Estou com uma grande dúvida (se alguém puder me ajudar serei muito grato): De acordo com o seguinte código:

@Override public boolean equals(Object obj) { Aluno outroAluno = (Aluno) obj; if(!(outroAluno instanceof Aluno)) return false; return this.nome.equals(outroAluno.nome) && this.numeroMatricula == outroAluno.numeroMatricula; }

@Override public int hashCode() { return this.nome.hashCode(); }

Apenas quero confirmar! Nesse caso acima, o objeto será armazenado na tabela de espalhamento de acordo com o atributo nome? É isso? E quando eu fazer a busca para fazer a comparação dos objetos, ele irá buscar por nome e encontrando os objetos (nesse caso posso ter dois com o mesmo nome, desde que tenham número de matriculas diferentes) ele irá fazer a verificação de acordo com o equals??? o HashCode seria para procura e o equals para a verificação?? Tudo isso partindo do contains? Não sei se fui muito claro, mas desde já agradeço a atenção e se alguém puder me ajudar serei muito grato!!!

2 respostas
solução!

As tabelas de espalhamento usam o inteiro retornado pelo método hashCode para armazenar o objeto. A definição do seu método hashCode usa o hashCode do atributo nome, mas a tabela de espalhamento não conhece atributos. Dois objetos diferentes podem possuir o mesmo hashCode e nesse caso ocorre uma colisão na tabela de espalhamento. Para resolver essa colisão a tabela compara os objetos usando o equals.

É interessante notar que se todos os objetos da sua tabela tiverem o mesmo hashCode, a tabela se comporta como uma lista.

Ps.: há um bug no seu método equals. A checagem do instanceof está sendo feita depois do cast. Vai lançar ClassCastException se for checado contra objetos de outras classes.

Huuum, entendi. Muitooo Obrigado!!!