Метод 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
мин.
Коллекции. Интерфейс List
10
мин.
Iterator в коллекциях Java
8
мин.