Метод Equals в Java. Его переопределение

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

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

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

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


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

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

mport java.util.*; class MyClass implements Cloneable { int myA; SomeClass myB; MyClass(int myA, SomeClass myB){ this.myA = myA; this.myB = myB; } // Переопределим equals чтоб он сравнивал не только то // ссылаются ли ссылки на один и тот же объект @Override // Как уже говорили все классы наследуют от Object // поэтому можно сделать так – equals(Object obj) // И теперь в equals параметром можно передавать // объекты любого типа – MyClass или SomeClass. public boolean equals(Object obj) { System.out.println(“Equals is called:” + this + “:” + obj); //проверка ссылки if (this == obj) return true; //проверка на пуст ли передаваемый объект if (obj == null) return false; //getClass возвращает название класса //переданного сюда параметром. //Проверка объектов на принадлежность одному классу if (getClass() != obj.getClass()) return false; //сравнение полей MyClass other = (MyClass) obj; if (myA != other.myA) return false; //для ссылочных полей сравнение по “!=” не подходит //нужно использовать equals и конечно в классах этих //ссылочных полей тоже должен быть определен //equals. в классе SomeClass ниже можно увидеть //пример такого equals. //Теперь мы его используем с строке кода ниже if (!myB.equals(other.myB)) return false; return true; } @Override public String toString(){ return “MyClass{” + “myA=” + myA + “, myB=” + myB + ‘}’; } @Override public MyClass clone() throws CloneNotSupportedException{ Object obj = super.clone(); MyClass myClass = (MyClass)obj; return myClass; } } class SomeClass implements Cloneable { int someVar; SomeClass(int someVar){ this.someVar = someVar; } // Тоже переопределяем equals @Override public boolean equals(Object obj){ System.out.println(“Equals is called:” + this + ” : ” + obj); // проверка ссылки if (this == obj) return true; // проверка на пуст ли передаваемый объект if (obj == null) return false; // Проверяем объекты на принадлежность одному классу if (getClass() != obj.getClass()) return false; // сравнение полей SomeClass other = (SomeClass) obj; if (someVar != other.someVar) return false; return true; } @Override public SomeClass clone() throws CloneNotSupportedException{ Object obj = super.clone(); SomeClass someclass = (SomeClass)obj; return someclass; } @Override public String toString(){ return “SomeClass{” + “someVar=” + someVar + ‘}’; } } public class EqualsLesson { public static void main(String[] args) throws CloneNotSupportedException{ SomeClass someClass = new SomeClass(10); MyClass myClass = new MyClass(10, someClass); SomeClass someClass1 = new SomeClass(10); MyClass myClass1 = new MyClass(10, someClass1); System.out.println(myClass.equals(myClass1)); // В консоли можно увидеть что equals включит true. // Это значит что myClass полностью // равен по значениям myClass1 // Давайте для дополнительной проверки изменим // какое-то поле myClass1 someClass1.someVar = 16; // проверим System.out.println(myClass.equals(myClass1)); // уже не полностью равны } }

Вывод:

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

Поймите важность метода hashCode в Java: как правильно переопределять его для работы с HashSet и HashMap, чтобы избежать дублирования элементов.
Time to read: 16

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

Разберитесь с интерфейсом List в Java: ArrayList, LinkedList и Vector. Узнайте, как работать с динамическими массивами и их реализациями.
Time to read: 10

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

Изучите Iterator в Java: универсальный способ перебора любых коллекций без знания их внутренней структуры. Примеры кода и объяснение работы.
Time to read: 8