Сравнение объектов в Java

Автор: content Понедельник, Апрель 9th, 2012 Нет комментариев

Рубрика: Язык 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 проверяет пару вещей чтобы понять, являются ли два экземпляра объекта действительно равными:

Выясняем, является ли obj экземпляром объекта Student. Если нет, мы можем автоматически предполагать, что они не равны.
Выясняем, одинаковы ли поля student_id в обоих экземплярах.

В этом случае два экземпляра Student равны, и на экран будет выведен текст: «Они равны!»

Источник: http://www.javaportal.ru/java/articles/equalsobjects.html
Автор: VanGlass
Перевод Станислав Песоцкий

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты