Этот пост был первоначально опубликован здесь по адресу Этот пост был первоначально опубликован здесь по адресу
Это будет один из серии постов, связанных с темами интервью, которые я буду писать. В этом посте мы рассмотрим важность методов equals и хэш-кода в Java.
equals() и hashCode() – это два метода, которые являются частью каждого класса в Java. Класс объектов является суперклассом для всех других классов в Java. equals и хэш-код – это методы, которые являются частью класса объектов
Как правило,,
Если два объекта равны в соответствии с реализацией, их хэш-код должен совпадать!
Давайте подойдем к пониманию этого со сценарием, вы когда-нибудь замечали, что происходит, когда идентичный заказ размещается в приложении Dominos в течение оговоренного времени по ошибке?
Любые повторяющиеся заказы будут отклонены, так как они подозревают, что это может быть связано с ошибкой.
Рекомендуется переопределять методы equals и hashCode для достижения лучших бизнес-решений. Так почему же лучше всего переопределить эти реализации? Перед этим нам нужно понять, что делает базовая реализация.
Поскольку Java является объектно-ориентированным языком программирования, за исключением примитивов, все остальное является объектом в Java.
public boolean equals(Object obj) { return (this == obj); }
Базовая реализация сравнивает и определяет, являются ли текущий объект и переданный объект одним и тем же, т. Е. Они совместно используют одно и то же место в памяти, как показано на приведенной ниже диаграмме. Оба объекта имеют одну и ту же ссылку в памяти кучи
Этот метод возвращает хэш-значение данного объекта в виде целого значения. В течение срока службы приложения ожидается, что значение хэш-кода объекта останется неизменным независимо от того, сколько раз он был вызван.
Следовательно, если 2 объекта считаются равными в соответствии с методом по умолчанию equals, то их значение хэш-кода всегда будет одинаковым.
Возвращаясь к нашему сценарию, в соответствии с вашими требованиями любые 2 заказа равны, если их атрибуты (пользователь заказа, элементы заказа, количество и адрес доставки) одинаковы. Итак, давайте переопределим метод equals, чтобы отразить один и тот же метод equals, переопределенный, как показано ниже
Результат при переопределении метода equal
Влияние будет заметно, если заказы будут храниться в коллекциях на основе хэша. Например, рассмотрим приведенный ниже пример, в котором заказы сохраняются в HashSet, и мы пытаемся проверить, присутствует ли у нас только что полученный заказ. Это было бы проблемой, так как мы еще не переопределили метод хэш-кода
Как вы можете видеть на изображении выше, 2 заказа, даже в соответствии с нашими требованиями, равны, это считается неравным.
Давайте переопределим метод хэш-кода, чтобы включить комбинацию наших атрибутов (это один из способов) для сравнения
Теперь давайте сравним заказы как с равным, так и с переопределенным хэш-кодом в соответствии с нашим требованием
Как мы видим, переопределение equals и метода хэш-кода приводит именно к тому, что мы ищем в случае любого типа коллекций, в которых хранятся заказы
Поэтому всегда соблюдайте контракт, он двоичный, либо оба метода (равные и хэш-код) должны быть переопределены, либо ни один из обоих методов.
Это будет один из серии постов, которые я буду писать и которые необходимы для интервью. Поэтому, если вы заинтересованы в этой теме и нашли ее полезной, пожалуйста, следуйте за мной по адресу мой сайт или dev
Оригинал: “https://dev.to/balasr21/understanding-equals-and-hashcode-in-java-33b8”