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

Dúvida hashcode

Pessoal, fiz o teste abaixo o retorno foi false quando eu verifico se aluno a3 e aluno a4 está matriculado . E também não entendi, o contains do Set. Ele chama o hashcode() do elemento que está dentro dele, nesse caso Aluno? Fiquei confuso.

package br.com.alura;

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class Curso {

    private String nome;
    private String instrutor;
    private List<Aula> aulas = new LinkedList<Aula>();
    private Set<Aluno> alunos = new HashSet<>();

    public Curso(String nome, String instrutor) {
        this.nome = nome;
        this.instrutor = instrutor;
    }

    public String getNome() {
        return nome;
    }

    public String getInstrutor() {
        return instrutor;
    }

    public List<Aula> getAulas() {
        return Collections.unmodifiableList(aulas);
    }

    public void adiciona(Aula aula) {
        this.aulas.add(aula);
    }

    public int getTempoTotal() {
        int tempoTotal = 0;

        for (Aula aula : aulas) {
            tempoTotal += aula.getTempo();
        }

        return tempoTotal;
    }

    @Override
    public String toString() {
        return "Curso: " + this.nome + ", tempo total: " + this.getTempoTotal() + ", aulas: " + this.getAulas();
    }

    public void matricula(Aluno a1) {
        this.alunos.add(a1);
    }

    public Set<Aluno> getAlunos() {
        return Collections.unmodifiableSet(alunos);
    }

    public void remove(Aluno aluno) {
        boolean confirmaExclucao = alunos.remove(aluno);
        if(confirmaExclucao){
            System.out.println("Aluno excluido com sucesso!");
        }else{
            System.out.println("Aluno não consta na lista.");
        }
    }

    public boolean estaMatriculado(Aluno aluno){
        return this.alunos.contains(aluno);
    }

}
package br.com.alura;

public class Aluno {
    private String nome;
    private int numerMatricula;

    public Aluno(String nome, int numeroMatricula) {
        if(nome == null){
            throw new NullPointerException();
        }

        this.nome = nome;
        this.numerMatricula = numeroMatricula;
    }

    public String getNome() {
        return nome;
    }

    public int getNumerMatricula() {
        return numerMatricula;
    }

    @Override
    public String toString() {
        return "[Aluno: " + this.nome + ", matricula: " + this.numerMatricula + "]";
    }


    @Override
    public boolean equals(Object obj) {
        Aluno outro = (Aluno) obj;
        return this.nome.equals(outro.nome);
    }


    @Override
    public int hashCode() {
        return this.nome.hashCode();
    }
}
package br.com.alura;

public class TestaCursoComAluno {
    public static void main(String[] args) {

        Curso javaColecoes = new Curso("Dominando as colecoes do Java",
                "Paulo Silveira");

        javaColecoes.adiciona(new Aula("Trabalhando com ArrayList", 21));
        javaColecoes.adiciona(new Aula("Criando uma Aula", 20));
        javaColecoes.adiciona(new Aula("Modelando com colecoes", 22));

        Aluno a1 = new Aluno("Rodrigo Turini", 34672);
        Aluno a2 = new Aluno("Guilherme Silveira", 5617);
        Aluno a3 = new Aluno("Maurício Aniche", 17645);
        Aluno a4 = new Aluno("Maurício Aniche", 17645);

        javaColecoes.matricula(a1);
        javaColecoes.matricula(a2);
        javaColecoes.matricula(a3);

        System.out.println("Todos os alunos matriculados");
        javaColecoes.getAlunos().forEach(aluno -> {
            System.out.println(aluno);
        });

        javaColecoes.remove(a4);
        System.out.println("Lista após tentativa de exclusão de um aluno");
        javaColecoes.getAlunos().forEach(aluno -> {
            System.out.println(aluno);
        });

        System.out.println("Tem o mesmo nome? " + a3.equals(a4));

        System.out.println("Aluno " + a3.getNome() + " esta matriculado?");
        System.out.println(javaColecoes.estaMatriculado(a4));

    }
}
2 respostas
solução!

Onde retorna false? Pelo que eu entendi, no segundo foreach deveria aparecer apenas 2 alunos. O sysout do mesmo nome deveria dar true, o aluno a3.getNome() não deveria estar matriculado e nem o a4.

O HashSet vai usar o hashcode do objeto para conseguir localizá-lo dentro da tabela de espalhamento usada internamente. Depois de ter localizado a entrada, ele precisa buscar pelo objeto, e aí ele vai usar o equals.

É como se fosse os produtos de um mercado.. O hashcode seria a seção deles e o equals para achar o produto exato.

Oi Alberto.

Fiz confusão, eu estava fazendo alguns testes na classe e não percebi que havia removido o aluno a4. Depois que tirei essa parte o código funcionou como deveria.

Mas, obrigado pela explicação. A sua analogia clareou bem rsrs

 "É como se fosse os produtos de um mercado.. O hashcode seria a seção deles e o equals para achar o produto exato."

Abraço!