Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

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

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. Оригинал тут.
Перевод Станислав Песоцкий.


  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2021
    Реклама на сайте