Рубрики

Методы equals () и hashCode () в Java

В Java.lang.object определены два очень важных метода: public boolean equals (Object obj) и public int hashCode ().

метод equals ()

В Java метод equals () используется для сравнения равенства двух объектов. Равенство можно сравнить двумя способами:

  • Неглубокое сравнение: стандартная реализация метода equals определена в классе Java.lang.Object, который просто проверяет, ссылаются ли две ссылки на объект (скажем, x и y) на один и тот же объект. т.е. проверяет, если х == у. Поскольку у класса Object нет элементов данных, которые определяют его состояние, он также известен как поверхностное сравнение.
  • Глубокое сравнение. Предположим, что класс обеспечивает собственную реализацию метода equals () для сравнения объектов этого класса с состоянием объектов. Это означает, что элементы данных (т.е. поля) объектов должны сравниваться друг с другом. Такое сравнение, основанное на элементах данных, называется глубоким сравнением.

Синтаксис:

public boolean equals  (Object obj)

// This method checks if some other Object
// passed to it as an argument is equal to 
// the Object on which it is invoked.

Некоторые принципы метода equals () класса Object: если некоторый другой объект равен данному объекту, то он следует этим правилам:

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

// Java-программа для иллюстрации
// как работают методы hashCode () и equals ()

import java.io.*;

  

class Geek 

{

      

    public String name;

    public int id;

          

    Geek(String name, int id) 

    {

              

        this.name = name;

        this.id = id;

    }

      

    @Override

    public boolean equals(Object obj)

    {

          

    // проверка, являются ли обе ссылки на объект

    // ссылаемся на тот же объект.

    if(this == obj)

            return true;

          

        // проверяет, является ли аргумент

        // набираем Geek, сравнивая классы

        // переданного аргумента и этого объекта.

        // if (! (obj instanceof Geek)) return false; ---> избегать

        if(obj == null || obj.getClass()!= this.getClass())

            return false;

          

        // приведение типа аргумента.

        Geek geek = (Geek) obj;

          

        // сравниваем состояние аргумента с

        // состояние объекта this.

        return (geek.name == this.name && geek.id == this.id);

    }

      

    @Override

    public int hashCode()

    {

          

        // Мы возвращаем Geek_id

        // в качестве значения хеш-кода.

        // мы также можем вернуть некоторые

        // другое вычисленное значение или может

        // быть адресом памяти

        // Объект, для которого он вызывается.

        // это зависит от того, как вы реализуете

        // метод hashCode ().

        return this.id;

    }

      
}

  
// Код драйвера

class GFG

{

      

    public static void main (String[] args)

    {

      

        // создание класса Objects of Geek.

        Geek g1 = new Geek("aa", 1);

        Geek g2 = new Geek("aa", 1);

          

        // сравниваем выше созданные Объекты.

        if(g1.hashCode() == g2.hashCode())

        {

  

            if(g1.equals(g2))

                System.out.println("Both Objects are equal. ");

            else

                System.out.println("Both Objects are not equal. ");

      

        }

        else

        System.out.println("Both Objects are not equal. "); 

    

}

Выход:

Both Objects are equal.

В приведенном выше примере смотрите строку:

// if(!(obj instanceof Geek)) return false;--> avoid.-->(a)

Мы использовали эту строку вместо строки выше:

if(obj == null || obj.getClass()!= this.getClass()) return false; --->(y)

Здесь, во-первых, мы сравниваем hashCode для обоих объектов (т.е. g1 и g2), и если оба объекта генерируют одинаковый хеш-код, это не означает, что они равны, поскольку хеш-код может быть одинаковым для разных объектов, если они имеют одинаковые id (в этом случае). Таким образом, если полученные сгенерированные значения хэш-кода равны для обоих Объектов, после этого мы сравниваем оба этих Объекта с их состоянием для того, чтобы переопределить метод equals (Object) внутри класса. И если оба объекта имеют одно и то же состояние в соответствии с методом equals (Object), то в противном случае они равны. И было бы лучше по производительности, если разные объекты генерируют разные значения хеш-кода.

Причина: Ссылка obj также может ссылаться на Объект подкласса Geek. Строка (b) гарантирует, что она вернет false, если переданный аргумент является Объектом подкласса класса Geek. Но условие оператора instanceof не возвращает false, если обнаружил, что переданный аргумент является подклассом класса Geek. Прочитайте InstanceOf оператора.

метод hashCode ()

Возвращает значение хеш-кода как целое число. Значение хэш-кода в основном используется в коллекциях на основе хэширования, таких как HashMap, HashSet, HashTable… .etc. Этот метод должен быть переопределен в каждом классе, который переопределяет метод equals ().
Синтаксис:

public int hashCode()

// This method returns the hash code value 
// for the object on which this method is invoked.

Генеральный договор hashCode:

  • Во время выполнения приложения, если hashCode () вызывается более одного раза для одного и того же объекта, тогда оно должно последовательно возвращать одно и то же целочисленное значение, при условии, что никакая информация, используемая в сравнении equals (Object) для объекта, не изменяется. Нет необходимости, чтобы это значение Integer оставалось одинаковым при выполнении одного приложения другим исполнением того же приложения.
  • Если два объекта равны, в соответствии с методом equals (Object), метод hashCode () должен выдавать одинаковое целое число для каждого из двух объектов.
  • Если два объекта являются неравными, в соответствии с методом equals (Object) , необязательно, чтобы значение Integer, созданное методом hashCode () для каждого из двух объектов, было отличным. Это может быть то же самое, но создание отдельного целого числа для каждого из двух объектов лучше для повышения производительности коллекций на основе хеширования, таких как HashMap, HashTable… и т. Д.

Примечание. Равные объекты должны генерировать один и тот же хэш-код, если они равны, однако неравные объекты не должны создавать отдельные хэш-коды.

Ссылка по теме: Переопределение равно в Java
Ссылка: JavaRanch

Эта статья предоставлена Nitsdheerendra . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Методы equals () и hashCode () в Java

0.00 (0%) 0 votes