Equals - решения для правильного сравнения
Метод equals() является одним из наиболее распространенных методов в Java. Он используется для сравнения двух объектов на равенство. Если два объекта равны, то метод equals() должен возвращать true, если они не равны, то метод должен возвращать false.
Сигнатура метода equals() в Java выглядит так:
public boolean equals(Object obj)
В качестве аргумента методу передается ссылка на другой объект, который мы сравниваем с текущим объектом.
Переопределить метод equals() следует, если мы сами создаем какой-то класс, и хотим сравнивать объекты этого класса на равенство. При этом можно использовать свою логику сравнения в соответствии с требованиями к нашему классу.
Рассмотрим пример. Пусть у нас есть класс Person, который содержит информацию о человеке: имя и возраст.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person other = (Person) obj;
return this.getName().equals(other.getName()) && this.getAge() == other.getAge();
}
}
Метод equals() в этом классе переопределен. Внутри метода сначала проверяем, не является ли переданный объект ссылкой на текущий объект. Если да, то возвращаем true, т.к. объекты равны.
Затем проверяем, является ли объект с которым мы сравниваем Person. Если нет, то считаем, что объекты не равны.
В конце сравниваем поля объекта с полями переданного в equals() объекта.
Использование метода equals() будет выглядеть следующим образом:
Person person1 = new Person("John", 25);
Person person2 = new Person("John", 25);
boolean equal = person1.equals(person2);
System.out.println(equal); // true
В данном случае мы создали два объекта класса Person с одинаковыми именем и возрастом. Вызов метода equals() вернет true, потому что объекты равны.
Отметим, что переопределение метода equals() является часто используемой практикой в Java, поскольку это позволяет сравнивать объекты на основе особенностей конкретного класса, а не значений их ссылок.