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

Por que o hashCode() é necessário quando se usa somente um primitivo como critério no equals()?

Modificando o método equals() na classe Estudante() para somente olhar o número de matrícula (um int) ao comparar 2 estudantes, o retorno é false quando não sobrescrevo o hashCode() e true quando sobrescrevo, mesmo quando o hash code é somente do nome do estudante, que é um atributo diferente do número:

@Override
public boolean equals(Object obj) {
        Estudante outroEstudante = (Estudante) obj;
        return this.numeroDeMatricula == outroEstudante.numeroDeMatricula;
}

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

Entendo que quando o hashCode() não é sobrescrito, mesmo que 2 objetos tenham os mesmos atributos, o hash code é diferente. Porém não entendi por que ele ainda é considerado para definir se 2 objetos são iguais quando o critério no equals() sobrescrito não o leva em conta (no caso, são comparados primitivos, que não usam o método equals() da classe Object, por isso deduzi que não é usado o método hashCode(), e por extensão um hash code, para compará-los).

1 resposta
solução!

Revendo essa aula, consegui entender melhor o que acontece:

Sets exigem que haja sobrescrita do método hashCode() na classe dos objetos que contêm para que o equals() funcione adequadamente. Mas essa não precisa ser a única condição para que dois objetos sejam considerados iguais. O equals() irá sempre consultar a tabela de espalhamento, e no caso de condições adicionais, irá verificá-las. Seguindo o exemplo acima, isso poderia ser feito da seguinte forma:

@Override
public boolean equals(Object obj) {
        Estudante outroEstudante = (Estudante) obj;
        return this.numeroDeMatricula == outroEstudante.numeroDeMatricula && this.nome.equals(outroEstudante.nome);
}

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

O código que exemplifiquei anteriormente sempre retorna false quando testo o método contains(). Isso ocorre porque o hash code gerado por hashCode() não é usado como critério por equals(), enquanto o critério que é de fato utilizado - o número de matrícula - não tem uma regra para a geração de um hash code explicitada. Portanto, na falta de um hash code do número de matrícula para procurar na tabela de espalhamento, o programa nunca consegue reconhecer dois números de matrícula, ainda que idênticos, como sendo iguais.