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.
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.
-
Eficiencia en Búsqueda y Almacenamiento: En colecciones como
HashMapyHashSet, elhashCode()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. -
Contrato con
equals(): Hay un contrato importante entrehashCode()yequals(). Si dos objetos son considerados iguales según el métodoequals(), deben tener el mismo valor dehashCode(). Sin embargo, objetos con el mismohashCode()no necesariamente son iguales.
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.
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.
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.