Menu
Coddy logo textTech

equals() e hashCode()

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 42 de 87.

Ao comparar objetos em Java, o operador == verifica se duas referências apontam para o mesmo local de memória. Para comparar o conteúdo real dos objetos, você precisa substituir o método equals().

public class Person {
    private String name;
    private int age;
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name);
    }
}

O método equals() segue um padrão comum: primeiro verifique se é o mesmo objeto, depois confirme o tipo e, por fim, compare os campos relevantes.

Sempre que você sobrescrever equals(), também deverá sobrescrever hashCode(). Esse é um contrato em Java: objetos que são iguais devem ter o mesmo código hash. Coleções baseadas em hash, como HashMap e HashSet, dependem dessa regra para funcionar corretamente.

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

O método utilitário Objects.hash() gera um código hash a partir dos mesmos campos usados em equals(). Se dois objetos Person tiverem o mesmo nome e a mesma idade, eles serão considerados iguais e produzirão códigos hash idênticos, garantindo um comportamento consistente em coleções.

challenge icon

Desafio

Fácil

Vamos criar um sistema de registros de alunos que implemente corretamente a igualdade entre objetos. Você criará uma classe Student na qual dois alunos serão considerados iguais se tiverem o mesmo ID de aluno e o mesmo nome, independentemente de serem o mesmo objeto na memória.

Você organizará seu código em dois arquivos:

  • Student.java: crie uma classe que represente um aluno com três campos privados: studentId (String), name (String) e gpa (double). Inclua um construtor para inicializar todos os campos e métodos getter para cada campo.

    Substitua o método equals() para que dois objetos Student sejam considerados iguais quando tiverem o mesmo studentId E o mesmo name. Siga o padrão convencional: verifique se é a mesma referência, verifique se é nulo e o tipo e, em seguida, compare os campos relevantes.

    Substitua o método hashCode() usando Objects.hash() com os mesmos campos usados em equals(). Lembre-se de importar java.util.Objects no início do arquivo.

  • Main.java: dê vida à sua classe Student comparando objetos de alunos. Você receberá seis entradas representando dois alunos: o ID, o nome e o GPA do primeiro aluno, seguidos pelo ID, nome e GPA do segundo aluno.

    Crie os dois objetos Student e, em seguida, faça três comparações e imprima os resultados:

    1. Imprima Same reference: seguido de se o primeiro aluno é igual a si mesmo (deve ser sempre true)
    2. Imprima Content equality: seguido de se o primeiro aluno é igual ao segundo aluno (com base na sua implementação de equals)
    3. Imprima Hash codes match: seguido de se ambos os alunos têm o mesmo código hash

Você receberá seis entradas: o ID do primeiro aluno (String), o nome do primeiro aluno (String), o GPA do primeiro aluno (double), o ID do segundo aluno (String), o nome do segundo aluno (String) e o GPA do segundo aluno (double).

Observe que, quando dois alunos têm IDs e nomes correspondentes, tanto equals() retorna true quanto seus códigos hash correspondem. Esse é o contrato que você deve manter!

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler os dados do primeiro estudante
        String id1 = scanner.nextLine();
        String name1 = scanner.nextLine();
        double gpa1 = scanner.nextDouble();
        scanner.nextLine(); // consumir a quebra de linha
        
        // Ler os dados do segundo estudante
        String id2 = scanner.nextLine();
        String name2 = scanner.nextLine();
        double gpa2 = scanner.nextDouble();
        
        // TODO: Criar dois objetos Student usando os dados de entrada
        
        // TODO: Print "Same reference: " followed by whether student1 equals itself
        
        // TODO: Print "Content equality: " followed by whether student1 equals student2
        
        // TODO: Print "Hash codes match: " followed by whether both students have the same hash code
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online