[Resolvido]Equals retornando false

Boa madrugada,

eu estou com uma duvida bem besta, não sei se é falta do sono ou burrice minha mas em fim:


public class Main {

	public static void main(String[] args) {
		MinhaClasse a = new MinhaClasse();
		MinhaClasse b = new MinhaClasse();
		System.out.println(a.equals(b));
		
	}
	
}

class MinhaClasse {
	
	int valor = 0;
	
}

Por que ele imprime false? Eles não são iguais?

Não são iguais, pois o objeto a e o objeto b são do mesmo tipo, porém duas referencias diferente, pensa na seguinte situacao quando vc instancia o objeto a ele irá ocupar um ponto na memoria, e quando vc instancia o objeto b ele irá ocupar um outro locar na memoria, logo são referencias diferente,

Entendeu!?

Nas classes definidas por ti deves implementar o equals e o hashCode onde defines as regras para a igualdade.

Por exemplo:

public class Main{

    public static void main(String[] args) {
        MinhaClasse a = new MinhaClasse(1);
        MinhaClasse b = new MinhaClasse(1);
        MinhaClasse c = new MinhaClasse(2);
        System.out.println(a.equals(b));
        System.out.println(a.equals(c));

    }

}

class MinhaClasse {

    int valor;

    MinhaClasse(int valor) {
        this.valor = valor;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        final MinhaClasse that = (MinhaClasse) o;

        if (valor != that.valor) {
            return false;
        }

        return true;
    }

    public int hashCode() {
        return valor;
    }
}

Equals é utilizado em Java para verificar se dois objetos são iguais. Ou você “override” o método Equals de Object ou será impresso false, pois você criou dois objetos na memória.

Caso você tenha um objeto e duas referências, a utilização de Equals retornará true.

Entendeu?

Entendi. Eu nunca precisei dar override nele porque eu sempre comparava as IDs (todas as classes têm um atributo do chamado id) então eu acho que foi por isso que eu nunca reparei nisso hehe.

Muito obrigado aos 3 por tirarem essa dúvida.

Edit:

Embora minha dúvida principal tenha sido respondida, a resposta do pmlm me deixou com outra dúvida: ao dar override no hashCode() eu tenho que fazer ele retornar algo como o id do objeto (como uma chave primária, um valor que nunca se repete)?

Objetos iguais tem de ter hashCodes iguais, embora hashCodes iguais possam não significar objetos iguais.
O hashCode deve ser obtido através da chave por forma a garantir isso.

[quote=pmlm]Objetos iguais tem de ter hashCodes iguais, embora hashCodes iguais possam não significar objetos iguais.
O hashCode deve ser obtido através da chave por forma a garantir isso.[/quote]

Entendi. Muito obrigado.