Рубрики

Переопределение метода equals в Java

Рассмотрим следующую Java-программу:

class Complex {

    private double re, im;    

      

    public Complex(double re, double im) {

        this.re = re;

        this.im = im;

    }

}

  
// Класс драйвера для тестирования класса Complex

public class Main {

    public static void main(String[] args) {

        Complex c1 = new Complex(10, 15);

        Complex c2 = new Complex(10, 15);

        if (c1 == c2) {

            System.out.println("Equal ");

        } else {

            System.out.println("Not Equal ");

        }

    }

}

Выход:

Not Equal 

Причина вывода «Не равно» проста: когда мы сравниваем c1 и c2, проверяется, ссылаются ли оба c1 и c2 на один и тот же объект или нет ( переменные объекта всегда являются ссылками в Java ). c1 и c2 относятся к двум разным объектам, поэтому значение (c1 == c2) равно false. Если мы создадим еще одну ссылку, скажем, c3, как показано ниже, то (c1 == c3) даст true.

Complex c3 = c1;  // (c3 == c1) будет верно

Итак, как мы проверяем равенство значений внутри объектов? Все классы в Java наследуются от класса Object прямо или косвенно (см. Пункт 1 этого ). Класс Object имеет несколько основных методов, таких как clone (), toString (), equals () и т. Д. Мы можем переопределить метод equals в нашем классе, чтобы проверить, имеют ли два объекта одинаковые данные или нет.

class Complex {

  

    private double re, im;

  

    public Complex(double re, double im) {

        this.re = re;

        this.im = im;

    }

  

    // Переопределение equals () для сравнения двух сложных объектов

    @Override

    public boolean equals(Object o) {

  

        // Если объект сравнивается с самим собой, возвращаем true

        if (o == this) {

            return true;

        }

  

        / * Проверить, является ли o экземпляром Complex или нет

          «null instanceof [type]» также возвращает false * /

        if (!(o instanceof Complex)) {

            return false;

        }

          

        // приведем o к Complex, чтобы мы могли сравнивать элементы данных

        Complex c = (Complex) o;

          

        // Сравнить элементы данных и вернуть соответственно

        return Double.compare(re, c.re) == 0

                && Double.compare(im, c.im) == 0;

    }

}

  
// Класс драйвера для тестирования класса Complex

public class Main {

  

    public static void main(String[] args) {

        Complex c1 = new Complex(10, 15);

        Complex c2 = new Complex(10, 15);

        if (c1.equals(c2)) {

            System.out.println("Equal ");

        } else {

            System.out.println("Not Equal ");

        }

    }

}

Выход:

Equal 

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

Ссылки:
Эффективное Java, второе издание

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

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

Переопределение метода equals в Java

0.00 (0%) 0 votes