como eu posso comparar ojetos com referências de memória diferentes mas que são do mesmo tipo, afim de dizer se eles são iguais ou não a partir dos atributos ? Já ouvir falar disso usanso o equals e hashCode, mas não entendo como funciona.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
como eu posso comparar ojetos com referências de memória diferentes mas que são do mesmo tipo, afim de dizer se eles são iguais ou não a partir dos atributos ? Já ouvir falar disso usanso o equals e hashCode, mas não entendo como funciona.
Olá Wellington! Tudo bem?
Para comparar objetos em Java com base em seus atributos, você deve usar os métodos equals e hashCode. Esses métodos são fundamentais quando você deseja verificar a igualdade lógica dos objetos, ou seja, se eles têm os mesmos valores de atributos, em vez de verificar se são o mesmo objeto na memória.
equals: Este método é utilizado para comparar o conteúdo de dois objetos. Para isso, você precisa sobrescrever o método equals na sua classe. Aqui está um exemplo de como você pode fazer isso na classe Filme:
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Filme filme = (Filme) obj;
return ano == filme.ano && titulo.equals(filme.titulo);
}
Neste exemplo, estamos comparando dois objetos Filme com base nos atributos titulo e ano.
hashCode: Sempre que você sobrescrever o método equals, é uma boa prática também sobrescrever o método hashCode. Isso é importante para o funcionamento correto de coleções baseadas em hash, como HashMap ou HashSet. Aqui está um exemplo de como você pode implementar o hashCode:
@Override
public int hashCode() {
return Objects.hash(titulo, ano);
}
O método Objects.hash é uma maneira conveniente de gerar um hash code baseado nos atributos relevantes do objeto.
Com esses métodos implementados, você pode comparar dois objetos Filme da seguinte forma:
Filme filme1 = new Filme("Avatar", 2009);
Filme filme2 = new Filme("Avatar", 2009);
if (filme1.equals(filme2)) {
System.out.println("Iguais");
} else {
System.out.println("Diferentes");
}
Neste caso, a saída será "Iguais", pois estamos comparando o conteúdo dos objetos, não suas referências de memória.
Espero ter ajudado e bons estudos!