Реализация equals и hashcode в Java: основы и примеры кода

Java — один из самых популярных языков программирования в мире. Он славится своей надежностью и удобством в использовании. Одним из важнейших моментов при работе с объектами Java является сравнение их значений. Для этого используются методы equals и hashcode.

Метод equals используется для определения, равны ли два объекта по значению, а метод hashcode — для хеширования объектов, чтобы ускорить их поиск в коллекциях. Правильная реализация этих методов — ключевой момент в создании качественной программы на Java.

В этой статье мы рассмотрим основные принципы реализации методов equals и hashcode в Java и приведем примеры кода, демонстрирующие правильный подход к их реализации.

Принципы реализации методов equals и hashcode

Метод equals:

  • Метод equals должен быть симметричен: если a.equals(b) возвращает true, то b.equals(a) также должен возвращать true.
  • Метод equals должен быть рефлексивным: объект должен быть равен самому себе, т.е. a.equals(a) всегда должен быть true.
  • Метод equals должен быть транзитивным: если a.equals(b) и b.equals(c) возвращают true, то a.equals(c) также должен возвращать true.
  • Метод equals должен быть консистентным: повторные вызовы a.equals(b) должны возвращать одинаковый результат, пока объекты не изменятся.
  • Метод equals должен возвращать false, если его аргумент null.
  • Метод equals должен проверять тип объекта, чтобы избежать ClassCastException.

Метод hashcode:

  • Метод hashcode должен возвращать одно и то же значение для объектов, которые равны с точки зрения метода equals.
  • Если два объекта возвращают true при вызове метода equals, то их hashcode должны быть равными.
  • Генерируйте hashcode на основе всех полей объекта, которые участвуют в equals.
  • Не генерируйте hashcode на основе transient полей (они не участвуют в equals).
  • Генерируйте hashcode на основе неизменяемых полей, чтобы получить более эффективное хэширование.
  • Следите за тем, чтобы вычисление hashcode было быстро для объектов большого размера.

Ключевые понятия

В Java для сравнения объектов используется метод equals. Он позволяет проверить, равны ли два объекта. При этом существует специальный метод hashcode, который используется для оптимизации работы коллекций. Ключевым понятием при работе с этими методами является иммутабельность объектов — то есть невозможность изменения объекта после его создания, а также согласованность equals и hashcode — когда одинаковые объекты имеют одинаковый hashcode и правильно сравниваются в методе equals.

Для реализации правильной работы методов equals и hashcode необходимо следовать нескольким принципам. Сначала необходимо определить, какие поля объекта будут использоваться в этих методах. Затем нужно переопределить методы equals и hashcode, где в equals производится сравнение объектов по заданным полям, а в hashcode высчитывается хэш-код объекта на основе этих же полей.

Важным моментом при использовании методов equals и hashcode является переопределение метода toString — он должен выводить информацию полей объекта, участвующих в equals и hashcode, чтобы было понятно, какие поля уникально идентифицируют каждый объект.

Также необходимо учитывать, что в Java существуют классы-обертки, которые могут создаваться несколько раз при работе приложения, и для них необходимо реализовывать согласованный equals и hashcode.

Необходимость переопределения

Ключевыми методами для работы с объектами в Java являются equals и hashcode. Метод equals позволяет проверить, равны ли два объекта, а метод hashcode возвращает хэш-код объекта, необходимый для работы с ним в структурах данных, таких как HashMap, HashSet и других.

По умолчанию методы equals и hashcode наследуются от класса Object и сравнивают объекты по ссылке. Однако в большинстве случаев нам необходимо производить сравнение объектов по их содержанию, определенным полям, чтобы получить корректный результат.

Для этого необходимо переопределить методы equals и hashcode в соответствующем классе. При переопределении метода equals следует убедиться, что он сравнивает все необходимые поля объекта, а метод hashcode должен возвращать уникальный идентификатор объекта, основанный на его поле или полях.

Переопределение методов equals и hashcode не только позволит получать корректный результат сравнения объектов, но и обеспечит правильную работу структур данных, использующих хэш-код для быстрого доступа к объектам.

Не следует забывать, что при переопределении методов equals и hashcode необходимо соблюдать определенные правила, такие как рефлексивность, симметрию, транзитивность и т. д. Невыполнение этих правил может привести к неожиданным результатам работы программы и ошибкам.

  • Рефлексивность метода equals означает, что любой объект должен быть равен самому себе: a.equals(a) должен возвращать true.
  • Симметричность метода equals означает, что если a.equals(b) возвращает true, то b.equals(a) также должен возвращать true.
  • Транзитивность метода equals означает, что если a.equals(b) и b.equals(c) возвращают true, то a.equals(c) также должен возвращать true.

Примеры реализации метода equals

Метод equals в Java позволяет определить равенство двух объектов. Хорошей практикой является переопределение метода equals для своих классов, чтобы он работал как ожидается. Для этого необходимо соблюсти правила:

  1. Если ссылки на объекты равны, то объекты равны;
  2. Если переданный объект не является экземпляром нужного класса, то они не равны;
  3. Сравниваем поля объектов на равенство, используя методы equals или оператор «==».

Например, рассмотрим класс Person:

public class Person {

private String name;

private int age;

// конструкторы, геттеры, сеттеры

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (!(o instanceof Person)) return false;

Person person = (Person) o;

return age == person.age &&

name.equals(person.name);

}

}

В данном примере мы сначала проверяем, ссылаются ли объекты на один и тот же экземпляр. Если да, то они равны. В противном случае проверяем, является ли переданный объект экземпляром класса Person. Если нет, то они не равны. Затем сравниваем значения полей name и age с помощью методов equals или оператора «==».

Еще один пример, класс Cat:

public class Cat {

private String name;

private int age;

// конструкторы, геттеры, сеттеры

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

Cat cat = (Cat) o;

return age == cat.age &&

Objects.equals(name, cat.name);

}

}

В данном примере мы проверяем, ссылаются ли объекты на один и тот же экземпляр и проверяем, является ли переданный объект экземпляром класса Cat. Затем сравниваем значения полей name и age с помощью метода Objects.equals, который позволяет обойти возможное исключение, если переменная null.

Также стоит учитывать, что при переопределении метода equals необходимо переопределить метод hashCode для возможности правильной работы с коллекциями.

Сравнение объектов по ссылкам

В Java экземпляры классов могут сравниваться по ссылкам, если не переопределены методы equals() и hashCode().

Сравнение объектов по ссылкам означает, что сравниваются их адреса в памяти, а не содержимое объектов. Если две переменные ссылочного типа указывают на один и тот же объект, то они равны. Если две переменные ссылочного типа указывают на разные объекты, то они не равны, даже если содержимое объектов идентично.

Например:

String str1 = new String("Hello");

String str2 = new String("Hello");

System.out.println(str1 == str2); // false

В данном примере переменные str1 и str2 указывают на разные объекты, даже если содержимое этих объектов идентично. Поэтому результат операции сравнения двух ссылок на эти объекты будет false.

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

Ручное сравнение полей объектов

Ручное сравнение полей объектов — это проверка каждого поля объекта на равенство. Для ручной проверки каждого поля объекта необходимо вызвать метод equals() для каждого поля и произвести сравнение, а затем вернуть итоговую оценку равенства объектов.

Для ручной проверки полей необходимо учитывать все поля объекта и следить за тем, что при добавлении новых полей в объект необходимо дополнить сравнение всех полей, чтобы предотвратить ошибки.

При ручном сравнении полей также необходимо учитывать не только значения полей, но и их типы. Например, необходимо убедиться, что поля одного объекта с типом «int» равны полям другого объекта с типом «Integer».

При ручном сравнении полей важно осуществлять сравнение поля с null. Если одно из полей объекта имеет значение null, то сравнение может вызвать исключение NullPointerException. Для этого необходимо использовать следующий пример:

  1. if (field1 == null && field2 == null) return true;
  2. if (field1 == null || field2 == null) return false;
  3. if (!field1.equals(field2)) return false;

Также необходимо проверять, что оба объекта имеют один и тот же тип. Иначе сравнение полей может вызвать ошибку ClassCastException. Для этого необходимо использовать следующий пример:

  1. if (getClass() != obj.getClass()) return false;

В итоге, ручное сравнение полей объектов требует от программиста внимательности, чтобы предотвратить ошибки и исключения. Однако, в некоторых ситуациях, когда у объектов несколько полей и нет возможности использовать автоматические методы сравнения, ручное сравнение может быть единственным решением.

Использование библиотечной функции Objects.equals

Когда мы сравниваем объекты в Java, мы часто используем метод equals. Однако, если мы не определяем метод equals сами, то сравнение будет происходить по ссылкам. В таких случаях нам могут помочь библиотечные функции, например, Objects.equals().

Objects.equals() сравнивает объекты на равенство, учитывая null объекты. Это означает, что даже если один из объектов является null, метод не вызовет ошибку NullPointerException, а просто вернет false. Вот пример использования:

if(Objects.equals(object1, object2)) {

// do something

}

Кроме того, если мы используем метод equals для примитивных данных, то компилятор автоматически заменит их на использование соответствующих методов из класса Objects. Например:

Integer i = 10;

if(i.equals(10)) { // автоматически вызовется Objects.equals(i, Integer.valueOf(10))

// do something

}

В целом, использование библиотечной функции Objects.equals() может значительно упростить сравнение объектов в Java и сделать код более читабельным и безопасным.

Примеры реализации метода hashcode

Метод hashcode является одним из ключевых при реализации equals, поэтому его реализация должна быть тщательно продумана и сбалансирована. Рассмотрим несколько примеров реализации метода hashcode:

Пример 1:

Дан класс Person с полями name и age:

«`java

public class Person {

private String name;

private int age;

// constructors, getters, setters, equals и т.д.

@Override

public int hashCode() {

return Objects.hash(name, age);

}

}

«`

Метод hashcode возвращает хеш-код на основе значений полей name и age. Этот подход является удобным для классов с несколькими полями.

Пример 2:

Дан класс Student с полями name и id:

«`java

public class Student {

private String name;

private long id;

// constructors, getters, setters, equals и т.д.

@Override

public int hashCode() {

return Integer.hashCode(Math.toIntExact(id));

}

}

«`

Метод hashcode возвращает хеш-код на основе значения поля id. В данном случае мы используем функцию Integer.hashCode, чтобы преобразовать long в int и сделать его «более читаемым» для компьютера.

Пример 3:

Дан класс Book с полями title, author и isbn:

«`java

public class Book {

private String title;

private String author;

private long isbn;

// constructors, getters, setters, equals и т.д.

@Override

public int hashCode() {

int result = 17;

result = 31 * result + title.hashCode();

result = 31 * result + author.hashCode();

result = 31 * result + Long.hashCode(isbn);

return result;

}

}

«`

Метод hashcode представляет собой «смесь» значений полей title, author и isbn, используя формулу 31 * result + field.hashCode(). Данная формула гарантирует, что разные комбинации значений будут давать разные хеш-коды.

Реализация метода hashcode может быть разной для каждого класса. Важно подобрать логику так, чтобы хеш-коды разных объектов класса отличались как можно чаще, что повышает эффективность работы алгоритмов, использующих hashcode, например, HashMap и HashSet.

Простейшая реализация

Для того чтобы реализовать методы equals и hashcode, нужно понимать, что hashCode это целое число, которое уникально идентифицирует объект в HashMap, HashSet и других коллекциях. В свою очередь, метод equals сравнивает два объекта на равенство.

Простейшая реализация метода hashCode может быть такой:

  1. Объявляем переменную int hash и инициализируем ее некоторым значением, например 17.
  2. Далее для каждого поля, которое хотим использовать для вычисления хэша, вычисляем хэш-код методом Objects.hashCode и добавляем его к hash.
  3. Возвращаем получившееся значение hash.

Простейшая реализация метода equals может быть такой:

  1. Проверяем, это ли тот же объект this, если да, то возвращаем true.
  2. Проверяем, не является ли объект null, если да, то возвращаем false.
  3. Проверяем, является ли объект класса, который мы сравниваем, если нет, то возвращаем false.
  4. Приводим объект к нужному классу и сравниваем каждое поле, которое хотим использовать для сравнения.
  5. Если все поля равны, то возвращаем true, иначе возвращаем false.

Это самая простая реализация, которую можно использовать в своем коде. Однако, если у нас есть несколько полей, то это может привести к коллизиям, когда разные объекты имеют одинаковый hashCode(). В следующих разделах мы рассмотрим более сложные реализации, которые решают эту проблему.

Сложная реализация с использованием полей объекта

Реализация методов equals и hashcode может быть достаточно сложной, особенно если используются поля объекта для определения равенства.

При такой реализации следует учитывать, что поля объекта могут быть ссылочными типами данных, и для сравнения необходимо использовать соответствующие методы.

Если рассматривать класс, содержащий несколько полей, при определении equals необходимо последовательно сравнивать каждое поле, при этом используя метод сравнения соответствующего типа. Отдельно нужно обрабатывать ситуации, когда поле является ссылкой на другой объект.

При определении hashcode сложность возникает из-за необходимости правильного распределения значений, чтобы обеспечить эффективную работу хэш-таблицы. Наиболее распространенной методикой является использование простых чисел и операций сдвига и побитового «или».

Важно помнить, что если класс содержит изменяемые поля, то реализация методов equals и hashcode должна учитывать эти изменения. В данном случае необходимо передавать нужные поля объекта конструктору хэша, а не метода equals.

Зная эти принципы, можно реализовать сложную реализацию equals и hashcode с использованием полей объекта, обеспечивая правильное сравнение и хэширование объектов.

Реализация на основе алгоритма Хэш-кода объектов Java 7

Один из основных принципов реализации equals и hashcode в Java — это использование одинаковых полей для создания hashCode() и сравнения объектов. В Java 7 в качестве алгоритма для генерации хэш-кода строки используется MurmurHash3. Он генерирует 32-битный хэш-код с хорошей скоростью и качеством, особенно для произвольных смешанных данных. Для объектов, содержащих несколько полей, обычно используется комбинация этих полей, которая потом передается в MurmurHash3.

Алгоритм MurmurHash3 имеет некоторые преимущества по сравнению с другими алгоритмами, такими как JenkinsHash и CRC32. Он более быстрый и имеет более высокую производительность, а также более равномерно распределяет хэши.

Для реализации hashCode() на основе MurmurHash3 в Java 7 можно использовать класс Objects. Вместо явного вызова метода hashCode() для каждого поля, можно использовать метод hash(), который принимает любое количество аргументов:

  • public static int hash(Object… values)

Метод Objects.hash() автоматически обрабатывает null значения и вызывает метод hashCode() для каждого переданного аргумента. Например, для объекта Person со свойствами firstName, lastName и age можно использовать следующую реализацию метода hashCode():

public int hashCode()
return Objects.hash(firstName, lastName, age);

В данном случае алгоритм MurmurHash3 объединит хэши всех переданных в метод поля и сгенерирует один хэш-код для всего объекта. Этот хэш-код будет использоваться в качестве ключа при добавлении объекта Person в HashSet или HashMap.

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

Особенности реализации методов equals и hashcode для коллекций

Коллекции являются важной частью Java и часто используются в различных приложениях. Для работы с коллекциями часто требуются операции сравнения и хэширования. При этом, реализация методов equals и hashcode для коллекций имеет свои особенности.

Equals для коллекций

Метод equals для коллекций должен проверять, что все элементы коллекции равны. При этом, проверка должна включать проверку порядка элементов и дублирование элементов. Для реализации этой проверки можно использовать метод equals для каждого элемента коллекции.

Hashcode для коллекций

Хэш-код коллекции должен зависеть от хэш-кодов всех элементов коллекции. При этом, порядок элементов и количество дубликатов должны быть учтены. Для реализации хэш-кода коллекции можно использовать метод hashCode для каждого элемента и применить алгоритм суммирования или исключающего ИЛИ.

Реализация equals и hashcode для специальных коллекций

Для специальных коллекций, таких как Set, List, Map, реализация методов equals и hashcode может отличаться. Например, для Set не имеет значения порядок элементов, а для Map необходимо учитывать как ключи, так и значения. При реализации методов для специализированных коллекций следует учитывать их особенности.

Вывод

Реализация методов equals и hashcode для коллекций требует учета особенностей коллекций и их операций. При правильной реализации данных методов можно гарантировать корректную работу коллекций в приложениях, а также использовать коллекции в других стандартных классах Java.

Ключевые моменты

Equals — метод для сравнения двух объектов на равенство. Обязательно нужно переопределять equals, если вы создаёте свой собственный класс.

HashCode — метод, который возвращает уникальное числовое значение для каждого объекта. Этот метод очень важен для HashMap или HashSet, которые используют хеширование для обеспечения уникальности элементов.

Один из ключевых принципов при переопределении equals и hashCode заключается в том, что если два объекта равны (equals возвращает true), то их хэш-коды также должны быть равны. Обратное справедливо тоже: если два объекта имеют одинаковый хэш-код, это не означает, что они равны (equals может вернуть false).

При переопределении equals и hashCode следует учитывать все поля объекта, которые влияют на его уникальность. Также важно следить за корректностью реализации этих методов, учитывая принципы транзитивности, симметрии и рефлексивности.

Кроме того, можно использовать генератор кода для этих методов, такой как Lombok или IDE, что может значительно упростить задачу и уменьшить риск ошибок.

Ключевые моменты
Equals — метод для сравнения двух объектов на равенство. Обязательно нужно переопределять equals, если вы создаёте свой собственный класс.
HashCode — метод, который возвращает уникальное числовое значение для каждого объекта. Этот метод очень важен для HashMap или HashSet, которые используют хеширование для обеспечения уникальности элементов.
Один из ключевых принципов при переопределении equals и hashCode заключается в том, что если два объекта равны (equals возвращает true), то их хэш-коды также должны быть равны.
При переопределении equals и hashCode следует учитывать все поля объекта, которые влияют на его уникальность. Также важно следить за корректностью реализации этих методов, учитывая принципы транзитивности, симметрии и рефлексивности.
Кроме того, можно использовать генератор кода для этих методов, такой как Lombok или IDE, что может значительно упростить задачу и уменьшить риск ошибок.

Примеры реализации

Рассмотрим пример реализации методов equals и hashCode на примере класса «Человек»:

public class Person {

private String name;

private int 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);

}

}

Метод equals сравнивает значения полей объектов типа Person, а метод hashcode вычисляет хеш-код на основе полей name и age. Обратите внимание на использование метода Objects.equals() и Objects.hash(), что упрощает реализацию и делает ее более надежной при использовании в сложных объектах.

Рассмотрим другой пример, где на основе класса «Автомобиль» реализуем методы equals и hashCode:

public class Car {

private String model;

private String brand;

private int year;

// конструктор и методы доступа

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

Car car = (Car) o;

return year == car.year &&

Objects.equals(model, car.model) &&

Objects.equals(brand, car.brand);

}

@Override

public int hashCode() {

return Objects.hash(model, brand, year);

}

}

В данном случае, метод equals сравнивает значения всех полей объектов типа Car, а метод hashCode вычисляет хеш-код на основе всех полей. И снова, для сравнения объектов по значениям полей используется метод Objects.equals(), а для вычисления хеша — метод Objects.hash().

В обоих случаях были использованы все поля объекта для их корректного сравнения. В этом заключается правильная реализация методов equals и hashCode — она должна быть комплексной и покрывать все поля класса, не забывая про использование методов Objects.equals() и Objects.hash().

Какие ошибки можно допустить при реализации методов equals и hashcode

Неправильное использование типов данных: при реализации метода equals необходимо учитывать типы данных сравниваемых объектов. Если они отличаются, то вернется false, даже если объекты на самом деле равны.

Неправильная реализация метода equals: реализация метода equals должна быть симметричной, транзитивной и рефлексивной. Если это условие не соблюдено, то может возникнуть проблема в сравнении объектов.

Некорректное использование метода hashcode: при реализации метода hashcode необходимо учитывать все поля объекта, включая неизменяемые поля. При изменении хотя бы одного поля значение хэшкода может измениться, что приведет к проблемам с использованием объекта.

Неправильное сравнение строк: при сравнении значений строк необходимо использовать метод equals, а не операцию сравнения «==». В противном случае может возникнуть проблема сравнения строк, содержащих одинаковые символы, но разных объектов.

Неправильное использование метода getClass: при сравнении объектов необходимо использовать метод getClass, а не instanceof. При изменении наследования классов может возникнуть проблема сравнения объектов.

Игнорирование null-значений: при сравнении объектов необходимо учитывать возможность наличия null-значений. Если это условие не учтено, то может возникнуть проблема сравнения объектов, содержащих null-значения.

Неправильное использование операторов сравнения: при реализации методов equals и hashcode необходимо правильно использовать операторы сравнения, чтобы избежать непредвиденных результатов.

Распространенные ошибки

Реализация методов equals и hashCode может быть довольно сложной и привести к различным ошибкам. Какие же ошибки можно встретить?

  • Некорректное использование типов данных — одной из наиболее распространенных ошибок является неверное определение метода equals для объектов, содержащих поле типа double или float. Также нельзя сравнивать примитивные типы данных, используйте для этого классы-обертки.
  • Неправильная реализация метода equals — необходимо понимать, что в методе equals должно происходить сравнение всех полей объекта, которые задействованы в методе hashCode.
  • Неправильная реализация метода hashCode — словно песня про бороду. Но действительно — в неправильной реализации hashCode заключается одна из самых распространенных ошибок. Не следует забывать, что хэш-код должен считаться на основе одних и тех же полей, что и в методе equals.
  • Сложность алгоритма hashCode — очень сложные алгоритмы порождают большое количество коллизий, а следовательно, деградацию производительности наших приложений. Это намного серьезнее, чем громоздкий код или неудобочитаемые комментарии.

Помните, что правильно реализованные методы equals и hashCode — это залог правильной работы наших приложений. Поэтому не стоит недооценивать эту задачу и нужно внимательно относиться к каждой из перечисленных ошибок.

Как избежать ошибок

1. Не изменяйте поля, которые используются в методах equals и hashCode

Методы equals и hashCode зависят от состояния объекта, которое определяется значениями его полей. Если вы измените поле объекта, у которого уже был вызван метод equals или hashCode, то результат может быть непредсказуемым.

2. Следуйте правилам переопределения методов equals и hashCode

Правильная реализация методов equals и hashCode важна для корректной работы программы. Переопределение этих методов должно учитывать все поля класса, которые определяют его состояние. Если вы пропустите какой-то поле, методы могут работать некорректно.

3. Не создавайте циклические зависимости между объектами

Если вы создадите циклическую зависимость между 객체ами, то методы equals и hashCode будут вызываться рекурсивно, что может привести к переполнению стека.

4. Используйте правильные типы для полей

Поле, которое используется в методах equals и hashCode, должно иметь правильный тип. Неправильный тип может привести к непредсказуемым результатам.

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

Тестирование является важным этапом в разработке. Важно проводить тестирование методов equals и hashCode на разные случаи, чтобы убедиться в корректной работе программы.

6. Используйте IDE для генерации методов equals и hashCode

Если вы забыли как правильно реализовать методы equals и hashCode, вы можете использовать возможности вашей IDE. Многие современные IDE имеют функцию генерации этих методов автоматически.

FAQ

Что такое метод equals() и зачем он нужен в Java?

Метод equals() в Java — это метод класса Object, который проверяет равенство двух объектов. В контексте программирования это может означать по-разному: сравнение значений полей объектов, проверка ссылок на один и тот же объект, и так далее. Например, при работе с коллекциями, метод equals() используется для проверки равенства элементов. Если метод equals() не переопределен в пользовательском классе, то он работает аналогично методу Object и сравнивает ссылки на объекты, а не их содержимое.

Что такое хеш-код (hashcode) и как он работает в Java?

Хеш-код (hashcode) в Java — это целочисленное значение, которое используется для определения расположения объекта в коллекциях. Хеш-код объекта должен быть одинаковым для всех экземпляров объекта, у которых метод equals() возвращает true. Хеш-код объекта вычисляется методом hashcode(), который также находится в классе Object. Как правило, хеш-код объекта вычисляется на основе его уникальных полей. Однако, если метод equals() переопределен в пользовательском классе, то часто переопределяют также метод hashcode(), чтобы обеспечить согласованность работы методов equals() и hashcode().

Ссылка на основную публикацию
Adblock
detector