Menu
Coddy logo textTech

equals() y hashCode()

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 42 de 87.

Al comparar objetos en Java, el operador == comprueba si dos referencias apuntan a la misma ubicación de memoria. Para comparar el contenido real de los objetos, debes sobrescribir el 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);
    }
}

El método equals() sigue un patrón estándar: primero comprueba si es el mismo objeto, después verifica el tipo y, por último, compara los campos relevantes.

Siempre que sobrescribas equals(), también debes sobrescribir hashCode(). Esto es un contrato en Java: los objetos que son iguales deben tener el mismo código hash. Las colecciones basadas en hash, como HashMap y HashSet, dependen de esta regla para funcionar correctamente.

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

El método de utilidad Objects.hash() genera un código hash a partir de los mismos campos utilizados en equals(). Si dos objetos Person tienen el mismo nombre y edad, se considerarán iguales y producirán códigos hash idénticos, lo que garantiza un comportamiento coherente en las colecciones.

challenge icon

Desafío

Fácil

Construyamos un sistema de registro de estudiantes que implemente correctamente la igualdad de objetos. Crearás una clase Student en la que dos estudiantes se consideren iguales si tienen el mismo ID de estudiante y el mismo nombre, independientemente de si son el mismo objeto en memoria.

Organizarás tu código en dos archivos:

  • Student.java: Crea una clase que represente a un estudiante con tres campos privados: studentId (String), name (String) y gpa (double). Incluye un constructor para inicializar todos los campos y métodos getter para cada campo.

    Reescribe el método equals() para que dos objetos Student se consideren iguales cuando tengan el mismo studentId Y el mismo name. Sigue el patrón estándar: comprueba si tienen la misma referencia, comprueba si es null y el tipo y, después, compara los campos relevantes.

    Reescribe el método hashCode() utilizando Objects.hash() con los mismos campos usados en equals(). Recuerda importar java.util.Objects en la parte superior de tu archivo.

  • Main.java: Da vida a tu clase Student comparando objetos estudiante. Recibirás seis entradas que representan a dos estudiantes: el ID, el nombre y el GPA del primer estudiante, seguidos del ID, el nombre y el GPA del segundo estudiante.

    Crea ambos objetos Student, después realiza tres comparaciones e imprime los resultados:

    1. Imprime Same reference: seguido de si el primer estudiante es igual a sí mismo (siempre debería ser true)
    2. Imprime Content equality: seguido de si el primer estudiante es igual al segundo estudiante (según tu implementación de equals)
    3. Imprime Hash codes match: seguido de si ambos estudiantes tienen el mismo código hash

Recibirás seis entradas: el ID del primer estudiante (String), el nombre del primer estudiante (String), el GPA del primer estudiante (double), el ID del segundo estudiante (String), el nombre del segundo estudiante (String) y el GPA del segundo estudiante (double).

Observa que, cuando dos estudiantes tienen ID y nombre coincidentes, tanto equals() devuelve true COMO sus códigos hash coinciden. ¡Este es el contrato que debes mantener!

Pruébalo tú mismo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lee los datos del primer estudiante
        String id1 = scanner.nextLine();
        String name1 = scanner.nextLine();
        double gpa1 = scanner.nextDouble();
        scanner.nextLine(); // consumir el salto de línea
        
        // Lee los datos del segundo estudiante
        String id2 = scanner.nextLine();
        String name2 = scanner.nextLine();
        double gpa2 = scanner.nextDouble();
        
        // TODO: Crea dos objetos Student usando los datos 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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Java online