Hash en Java y hashCode

JavaJavaBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderemos sobre el método hashCode() en Java. El hash es una técnica utilizada para generar un valor único para una clave dada. El hash se utiliza para implementar Tablas Hash y estas estructuras de datos proporcionan una forma más rápida y eficiente de buscar datos. El método hashCode() devuelve un valor entero para una clave dada. Aprenderemos cómo utilizar el método hashCode() y la importancia de escribir un método hashCode() fuerte.

Creando una clase Student

Primero, creemos una clase Student con campos como nombre, número de registro y GPA.

class Student {
  String name;
  int regNo;
  double gpa;

  Student(String name, int regNo, double gpa) {
    this.name = name;
    this.regNo = regNo;
    this.gpa = gpa;
  }

}

Usando el método equals()

El método equals() se utiliza para comprobar si dos objetos son iguales o no. En este caso, compararemos dos objetos Student en función de su nombre, número de registro y GPA.

@Override
public boolean equals(Object obj) {
  if (this == obj) {
    return true;
  }
  if (obj == null || getClass()!= obj.getClass()) {
    return false;
  }
  Student student = (Student) obj;
  return regNo == student.regNo &&
         Double.compare(student.gpa, gpa) == 0 &&
         Objects.equals(name, student.name);
}

Implementando el método hashCode()

El método hashCode() devuelve un valor entero para una clave dada. Implementaremos un método básico de hashCode() que solo devuelva un entero basado en la primera letra del nombre del estudiante.

@Override
public int hashCode() {
  return (int) this.name.charAt(0) - 64;
}

Usando el método hashCode()

Ahora podemos usar el método hashCode() para generar códigos hash para los objetos Student.

Student s1 = new Student("Alice", 1, 3.7);
Student s2 = new Student("Bob", 2, 3.9);

System.out.println("s1's hash code: " + s1.hashCode());
System.out.println("s2's hash code: " + s2.hashCode());

Implementando un método hashCode() más robusto

El método hashCode() anterior no es muy robusto, ya que diferentes estudiantes con la misma primera letra en su nombre se les asignará el mismo valor hash. Vamos a utilizar los otros campos de la clase para escribir un método hashCode() más fuerte.

@Override
public int hashCode() {
  return ((int) this.name.charAt(0) - 64) * this.regNo * (int) this.gpa;
}

Usando el método hashCode() incorporado

También podemos usar el método hashCode() incorporado de la clase String para generar códigos hash para la clase Student.

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

Probando la igualdad

Ahora, probemos la igualdad de dos objetos Student usando el método equals().

Student s1 = new Student("Alice", 1, 3.7);
Student s2 = new Student("Bob", 2, 3.9);
Student s3 = new Student("Alice", 1, 3.7);

System.out.println("s1 equals s2: " + s1.equals(s2));
System.out.println("s1 equals s3: " + s1.equals(s3));

Implementando hashCode() para Set

Podemos usar la clase Student en un HashSet. Necesitamos sobrescribir tanto el método equals() como el método hashCode() para que el HashSet funcione correctamente.

Set<Student> studentSet = new HashSet<>();
studentSet.add(new Student("Alice", 1, 3.7));
studentSet.add(new Student("Bob", 2, 3.9));
studentSet.add(new Student("Alice", 1, 3.7));

System.out.println(studentSet.size()); // Output: 2

Implementando hashCode() para Map

También podemos usar la clase Student en un HashMap. Necesitamos sobrescribir tanto el método equals() como el método hashCode() para que el HashMap funcione correctamente.

Map<Student, String> studentMap = new HashMap<>();
studentMap.put(new Student("Alice", 1, 3.7), "Good");
studentMap.put(new Student("Bob", 2, 3.9), "Excellent");
studentMap.put(new Student("Alice", 1, 3.7), "Very Good");

System.out.println(studentMap.size()); // Output: 2

Ejecutando el código

Para ejecutar el código, primero, navegue hasta el directorio donde se guardó el código usando el comando cd. Luego use el comando javac para compilar el código y el comando java para ejecutar el código.

cd ~/project
javac HashCodeDemo.java
java HashCodeDemo

Resumen

En este laboratorio, aprendimos sobre el método hashCode() en Java, que se utiliza para generar un valor único para una clave dada. Implementamos los métodos hashCode() y equals() para la clase Student y aprendimos cómo escribir un método hashCode() fuerte. También aprendimos cómo usar los métodos hashCode() y equals() en HashSet y HashMap.