Топ-100Метод Equals и его переопределение - CodOrbits
LogoCodOrbits

Раздел: Java Core

Раздел охватывает ключевые возможности языка Java: аннотации, исключения, generics, лямбда-выражения, интерфейсы и другие базовые концепции.

Все разделы
Иконка Java Core

Метод Equals и его переопределение

Last updated: 5 мая 2025 г.

Следующий метод Object – это equals.

Возвращает boolean значение.

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

Если нам нужно проверить не только это, а является ли содержимое одного объекта одинаковым с другим объектом, то его нужно переопределять.


Переопределение Equals

Пример программы:    

1mport java.util.*;
2
3class MyClass implements Cloneable {
4    int myA;
5    SomeClass myB;
6
7    MyClass(int myA, SomeClass myB){
8        this.myA = myA;
9        this.myB = myB;
10    }
11
12    // Переопределим equals чтоб он сравнивал не только то
13    // ссылаются ли ссылки на один и тот же объект
14    @Override
15    // Как уже говорили все классы наследуют от Object
16    // поэтому можно сделать так – equals(Object obj)
17    // И теперь в equals параметром можно передавать
18    // объекты любого типа – MyClass или SomeClass.
19    public boolean equals(Object obj) {
20        System.out.println("Equals is called:" + this + ":" + obj);
21        //проверка ссылки
22        if (this == obj)
23            return true;
24        //проверка на пуст ли передаваемый объект
25        if (obj == null)
26            return false;
27        //getClass возвращает название класса
28        //переданного сюда параметром.
29        //Проверка объектов на принадлежность одному классу
30        if (getClass() != obj.getClass())
31            return false;
32        //сравнение полей
33        MyClass other = (MyClass) obj;
34        if (myA != other.myA)
35            return false;
36        //для ссылочных полей сравнение по "!=" не подходит
37        //нужно использовать equals и конечно в классах этих
38        //ссылочных полей тоже должен быть определен
39        //equals. в классе SomeClass ниже можно увидеть
40        //пример такого equals.
41        //Теперь мы его используем с строке кода ниже
42        if (!myB.equals(other.myB))
43            return false;
44        return true;
45    }
46    @Override
47    public String toString(){
48        return "MyClass{" + "myA=" + myA + ", myB=" + myB +};
49    }
50
51    @Override
52    public MyClass clone() 
53        throws CloneNotSupportedException{
54        Object obj = super.clone();
55        MyClass myClass = (MyClass)obj;
56        return myClass;
57    }
58}
59
60class SomeClass implements Cloneable {
61    int someVar;
62    SomeClass(int someVar){
63        this.someVar = someVar;
64    }
65
66    // Тоже переопределяем equals
67    @Override
68    public boolean equals(Object obj){
69        System.out.println("Equals is called:" 
70            + this + " : " + obj);
71
72        // проверка ссылки
73        if (this == obj)
74            return true;
75        // проверка на пуст ли передаваемый объект
76        if (obj == null)
77            return false;
78        // Проверяем объекты на принадлежность одному классу
79        if (getClass() != obj.getClass())
80            return false;
81        // сравнение полей
82        SomeClass other = (SomeClass) obj;
83        if (someVar != other.someVar)
84            return false;
85        return true;
86    }
87
88    @Override
89    public SomeClass clone() 
90        throws CloneNotSupportedException{
91        Object obj = super.clone();
92        SomeClass someclass = (SomeClass)obj;
93        return someclass;
94    }
95
96    @Override
97    public String toString(){
98        return "SomeClass{" + "someVar=" + someVar +};
99    }
100}
101
102public class EqualsLesson {
103    public static void main(String[] args)
104        throws CloneNotSupportedException{
105        SomeClass someClass = new SomeClass(10);
106        MyClass myClass = new MyClass(10, someClass);
107        SomeClass someClass1 = new SomeClass(10);
108        MyClass myClass1 = new MyClass(10, someClass1);
109        System.out.println(myClass.equals(myClass1));
110
111        // В консоли можно увидеть что equals включит true.
112        // Это значит что myClass полностью
113        // равен по значениям myClass1
114
115        // Давайте для дополнительной проверки изменим
116        // какое-то поле myClass1
117        someClass1.someVar = 16;
118        // проверим
119        System.out.println(myClass.equals(myClass1));
120        // уже не полностью равны
121    }
122}

Вывод:


Следующие уроки

Метод hashCode и его переопределение

16
мин.

Similar Articles Icon
Divider

Коллекции. Интерфейс List

10
мин.

Similar Articles Icon
Divider

Iterator в коллекциях Java

8
мин.

Similar Articles Icon