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
HashMap
yHashSet
, 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.