Логин:   Пароль:




Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100

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

Сравнение объектов в 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 равны, и на экран будет выведен текст: "Они равны!"


Дэвид Флэнаган
"Java. Справочник"
Подробнее>>
Заказать>>


Е. Е. Аккуратов
"Знакомьтесь: Java. Самоучитель"
Подробнее>>
Заказать>>

Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Apache Struts 2.0.11
Apache MyFaces Trinidad Core 1.2.3.
Sun переводит мобильные устройства с Java ME на Java SE
Хакерская атака!