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

Pequena dúvida

Fiz os códigos junto ao instrutor, porém no caso da linha abaixo ainda está apresentando "false".

        // Teste 3
        Aluno aluno = new Aluno("Douglas Quintanilha", 11824763);
        Aluno alunoQueVeioDoFormulario = new Aluno("Douglas Quintanilha", 11824763);

        System.out.println("O aluno e igual ao aluno que veio do formulario?");
        System.out.println(aluno == alunoQueVeioDoFormulario);

Não era para sair "true" ?

5 respostas

Oi Leonardo, tudo bem ?

Tu chegou a implementar os métodos equals e hashcode ? Se sim, consegue mostrar pra gente como estão ?

Olá Matheus,

Sim, utilize os que o Paulo fez no video e também tentei pelos que o Eclipse gera:

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

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

E depois tentei com:

@Override
public int hashCode() {
    return Objects.hash(nome, numeroMatricula);
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Aluno other = (Aluno) obj;
    return Objects.equals(nome, other.nome) && numeroMatricula == other.numeroMatricula;
}

Dei uma olhada na implementação do instrutor e isso devia funcionar:

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

@Override
public int hashCode() {
    return this.nome.hashCode();
}
solução!

Olá,

System.out.println(aluno == alunoQueVeioDoFormulario);

Não era para sair "true" ?

Não.

O operador == compara as se as referências são as mesmas. Ou seja, não são os mesmo objetos, são objetos distintos.

Já o equals faz a comparação baseado em um critério determinado por vc no método equals. Esse critério pode ser definido como se um atributo de um objeto for igual ao atributo do outro objeto, quero considerar que são iguais. Por isso, os resultados abaixo.

public class Test {

    public static void main(String[] args) {
        A a1 = new A(1);
        A a2 = new A(1);
        A a3 = a1;

        System.out.println("a1 equals a2: " + (a1.equals(a2)));
        System.out.println("a1 == a2: " + (a1 == a2));
        System.out.println("a1 == a3: " + (a1 == a3));
    }

}

class A {
    int value;

    public A(int value) {
        this.value = value;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + value;
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        A other = (A) obj;
        if (value != other.value)
            return false;
        return true;
    }

    @Override
    public String toString() {
        return String.format("%d", this.value);
    }
}
a1 equals a2: true
a1 == a2: false
a1 == a3: true
Resolveu? Por favor, marcar como solucionado ✔. Bons estudos! ⌣

Fala Luciano, Tudo bem?

Perfeito é isso mesmo, a diferença está no uso do operador == e no equals. Então o operador "==" sempre vai tratar de referencias de objetos, é isso? Se eu quiser uma critério alternativo, tenho que usar o "equals".

Muito obrigado!

    // Teste 3
    Aluno aluno = new Aluno("Douglas Quintanilha", 11824763);
    Aluno alunoQueVeioDoFormulario = new Aluno("Douglas Quintanilha", 11824763);

    System.out.println("O aluno e igual ao aluno que veio do formulario?");
    System.out.println(aluno == alunoQueVeioDoFormulario); // O operador == compara as se as referências são as mesmas. Ou seja, não são os mesmo objetos, são objetos distintos.

    System.out.println(aluno.equals(alunoQueVeioDoFormulario)); // Já o equals faz a comparação baseado em um critério determinado por vc no método equals.