04 ‐ hashCode() - Cyb3rh4ck/java-core-fundamentals GitHub Wiki

El método hashCode() en Java es fundamental para las colecciones que utilizan tablas hash, como HashMap, HashSet, y Hashtable. A continuación, te proporciono una explicación detallada de qué es y cómo funciona.

Método hashCode()

El método hashCode() es una función miembro de la clase Object, lo que significa que está disponible en todas las clases de Java, ya que todas las clases heredan de Object. Su propósito es proporcionar un número entero (el "código hash") que representa el objeto. Este código hash se utiliza principalmente en colecciones que usan algoritmos de hash.

Propósito del hashCode()

  1. Eficiencia en Búsqueda y Almacenamiento: En colecciones como HashMap y HashSet, el hashCode() se utiliza para calcular el índice del array donde se almacenará el objeto. Esto permite que las operaciones de búsqueda, inserción y eliminación sean más rápidas.
  2. Contrato con equals(): Hay un contrato importante entre hashCode() y equals(). Si dos objetos son considerados iguales según el método equals(), deben tener el mismo valor de hashCode(). Sin embargo, objetos con el mismo hashCode() no necesariamente son iguales.

Implementación Personalizada

Cuando creas tus propias clases y planeas usarlas en colecciones basadas en hash, es crucial sobrescribir los métodos hashCode() y equals() para asegurar que funcionen correctamente.

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

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

    // Getters and setters (if necessary)
}

En este ejemplo, sobrescribimos equals() y hashCode() para la clase Person. Usamos Objects.hash() para generar el código hash basado en los campos name y age.

Ejemplo Práctico

import java.util.HashSet;
import java.util.Set;

public class HashCodeExample {
    public static void main(String[] args) {
        Set<Person> persons = new HashSet<>();
        persons.add(new Person("Alice", 30));
        persons.add(new Person("Bob", 25));

        Person person1 = new Person("Alice", 30);
        System.out.println("Contains Alice, 30: " + persons.contains(person1)); // true

        Person person2 = new Person("Charlie", 25);
        System.out.println("Contains Charlie, 25: " + persons.contains(person2)); // false
    }
}

En este ejemplo, creamos un conjunto de Person y verificamos si contiene ciertos objetos basados en sus atributos. Gracias a la implementación correcta de hashCode() y equals(), la colección puede identificar correctamente si un objeto ya está presente.

Resumen

El método hashCode() es esencial para el rendimiento y la corrección de las colecciones basadas en hash. Asegura que los objetos puedan ser almacenados y recuperados de manera eficiente. Siempre que sobrescribas equals(), también debes sobrescribir hashCode() para mantener el contrato entre estos métodos.

⚠️ **GitHub.com Fallback** ⚠️