Рубрики
Без рубрики

Понимание равенства и хэш-кода в Java

Этот пост был первоначально опубликован здесь по адресу https://balasr.com/blog/2n857rotH9da7mBF5ZWO2V Это поехали… С тегами java, интервью, учебник, webdev.

Этот пост был первоначально опубликован здесь по адресу Этот пост был первоначально опубликован здесь по адресу

Это будет один из серии постов, связанных с темами интервью, которые я буду писать. В этом посте мы рассмотрим важность методов 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”