Java Hashing и HashCode

JavaJavaBeginner

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе мы узнаем о методе hashCode() в Java. Хеширование - это техника, используемая для генерации уникального значения для заданного ключа. Хеширование используется для реализации хеш-таблиц, и эти структуры данных обеспечивают более быстрый и эффективный способ поиска данных. Метод hashCode() возвращает целочисленное значение для заданного ключа. Мы узнаем, как использовать метод hashCode() и важность написания надежного метода hashCode().

Создание класса Student

Сначала создадим класс Student с полями, такими как имя, регистрационный номер и средний балл.

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

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

}

Использование метода equals()

Метод equals() используется для проверки, равны ли два объекта или нет. В этом случае мы сравним два объекта класса Student по их имени, регистрационному номеру и среднему баллу.

@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);
}

Реализация метода hashCode()

Метод hashCode() возвращает целочисленное значение для заданного ключа. Мы реализуем базовый метод hashCode(), который возвращает целое число на основе первой буквы имени студента.

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

Использование метода hashCode()

Теперь мы можем использовать метод hashCode() для генерации хеш-кодов для объектов класса 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());

Реализация надежного метода hashCode()

Предыдущий метод hashCode() не очень надежный, так как разные студенты с одинаковой первой буквой имени будут иметь одинаковое хеш-значение. Давайте используем другие поля класса для написания более надежного метода hashCode().

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

Использование встроенного метода hashCode()

Мы также можем использовать встроенный метод hashCode() для класса String для генерации хеш-кодов для класса Student.

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

Тестирование равенства

Теперь давайте протестируем равенство двух объектов класса Student с использованием метода 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));

Реализация hashCode() для Set

Мы можем использовать класс Student в HashSet. Нам нужно переопределить оба метода equals() и hashCode(), чтобы HashSet работал правильно.

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

Реализация hashCode() для Map

Мы также можем использовать класс Student в HashMap. Нам нужно переопределить оба метода equals() и hashCode(), чтобы HashMap работал правильно.

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

Запуск кода

Для запуска кода сначала перейдите в директорию, где сохранен код, с использованием команды cd. Затем используйте команду javac для компиляции кода и команду java для запуска кода.

cd ~/project
javac HashCodeDemo.java
java HashCodeDemo

Резюме

В этом практическом занятии мы изучили метод hashCode() в Java, который используется для генерации уникального значения для заданного ключа. Мы реализовали методы hashCode() и equals() для класса Student и узнали, как писать надежный метод hashCode(). Мы также узнали, как использовать методы hashCode() и equals() в HashSet и HashMap.