div.main {margin-left: 20pt; margin-right: 20pt}
Сравнение объектов в Java
Я часто слышу один вопрос: "Как сравнить два объекта, чтобы
понять, равны ли они?" Ответ на этот вопрос довольно прост, но часто неправильно
истолковывается. Каждый класс по умолчанию вызывает метод equals, который имеет
следующее определение:
public boolean equals(Object obj)
Этот метод получает объект в качестве аргумента, выполняет
сравнение и возвращает true, если два экземпляра объекта равны, и false в случае
их неравенства. Что некоторые разработчики неверно понимают - то, что метод
equals по умолчанию сравнивает только адреса двух объектов, а не их содержимое.
Чтобы сравнить содержимое двух объектов мы должны переопределить метод equals.
Пример.
public class Student
{
private int student_id;
public Student(int student_id)
{
this.student_id = student_id;
}
public static void main(String[] args)
{
Student s1 = new Student(8888);
Student s2 = new Student(8888);
if(s1.equals(s2))
System.out.println("Они равны!");
else
System.out.println("Они не равны!");
}
}
В представленном выше примере объекты Student созданы
в конструкторе с одинаковым student_id, а метод main выводит на экран:
"Они не равны!" Причина состоит в том, что вы не переопределили метод
equals. При не переопределенном методе equals виртуальная машина
просматривает адреса памяти каждого объекта, сравнивает их и в этом случае
возвращает false. Это не то, чего хотим мы. Мы на самом деле хотим
сравнить содержимое каждого объекта Student.
Чтобы решить эту проблему мы должны переопределить метод equals в классе Student таким образом.
|
public class Student
{
private int student_id;
public Student(int student_id)
{
this.student_id = student_id;
}
public boolean equals(Object obj)
{
if(obj == this)
return true;
/* obj ссылается на null */
if(obj == null)
return false;
/* Удостоверимся, что ссылки имеют тот же самый тип */
if(!(getClass() == obj.getClass()))
return false;
else
{
Student tmp = (Student)obj;
if(tmp.student_id == this.student_id)
return true;
else
return false;
}
}
public static void main(String[] args)
{
Student s1 = new Student(8888);
Student s2 = new Student(8888);
if(s1.equals(s2))
System.out.println("Они равны!");
else
System.out.println("Они не равны!");
}
}
Теперь в новом определении класса переопределенный
метод equals проверяет пару вещей чтобы понять, являются ли два экземпляра
объекта действительно равными:
1. Выясняем, является ли obj экземпляром объекта
Student. Если нет, мы можем автоматически предполагать, что они не равны.
2. Выясняем, одинаковы ли поля student_id в обоих
экземплярах.
В этом случае два экземпляра Student равны, и на экран
будет выведен текст: "Они равны!"
VanGlass
2000. Оригинал тут. Перевод Станислав
Песоцкий.
|
|
|
|