Подтвердить что ты не робот

Что делает equals (Object obj)?

Я часто нашел метод равных в разных местах. Что это на самом деле? Важно ли иметь это в каждом классе?

   public boolean equals(Object obj)
    {
    if (obj == this)
    {
        return true;
    }
    if (obj == null)
    {
        return false;
    }
    if (obj instanceof Contact)
    {
        Contact other = (Contact)obj;
        return other.getFirstName().equals(getFirstName()) &&
                other.getLastName().equals(getLastName()) &&
                other.getHomePhone().equals(getHomePhone()) &&
                other.getCellPhone().equals(getCellPhone());

    }
    else
    {
        return false;
    }
}
4b9b3361

Ответ 1

Он переопределяет "равенство" объектов.

По умолчанию (определяется в java.lang.Object), объект равен другому объекту, только если он является одним и тем же экземпляром. Но вы можете предоставить пользовательскую логику равенства при ее переопределении.

Например, java.lang.String определяет равенство, сравнивая внутренний массив символов. Вот почему:

String a = new String("a"); //but don't use that in programs, use simply: = "a"
String b = new String("a");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true

Несмотря на то, что вам может не потребоваться проверка на равенство, классы, которые вы используете. Например, реализации List.contains(..) и List.indexOf(..) используют .equals(..).

Отметьте javadoc для точного контракта, требуемого методом equals(..).

Во многих случаях при переопределении equals(..) вам также необходимо переопределить hashCode() (используя те же поля). Это также указано в javadoc.

Ответ 2

Различные классы имеют разные критерии для того, что делает 2 объекта "равными". Обычно equals() возвращает true, если это тот же объект:

Object a = new Object();
Object b = new Object();
return(a.equals(b));

Это вернет false, хотя они оба являются классами "Объект", они не являются одним и тем же экземпляром. a.equals(a) вернет true.

Однако в таких случаях, как String, вы можете иметь 2 разных экземпляра, но равенство строк основано на буквальных символах, которые составляют эти строки:

String a = new String("example");
String b = new String("example");
String c = new String("another");
a.equals(b);
a.equals(c);

Это все разные экземпляры String, но первые equals вернут true, потому что они оба являются "примером", но второй не будет, потому что "example" не является "другим".

Вам не нужно переопределять equals() для каждого класса, только если для равенства есть специальный случай, например класс, содержащий 3 строки, но для определения равенства используется только первая строка. В приведенном примере может быть другое поле, description, которое может отличаться для двух разных "Контакты", но 2 "Контакты" будут считаться равными, если эти 4 критерия совпадают (имя/фамилия и домашний/номера сотового телефона), в то время как совпадение или совпадение описания не воспроизводится в том, равны ли 2 контакта.

Ответ 3

Помимо всего, что дает Божо, есть некоторые дополнительные вещи, о которых следует помнить, если переопределение равно:

  • что-то .equals(null) должно всегда возвращать false - то есть null не равно никому другому. Это требование соблюдается во втором, если ваш код.

  • если это правда, что что-то == что-то еще, то и что-то .equals( что-то еще ) также должно быть истинным. (то есть идентичные объекты должны быть равны) Первый, если ваш код позаботится об этом.

  • .equals ДОЛЖЕН быть симметричным для ненулевых объектов, т.е. a.equals(b) должен быть таким же, как b.equals(a). Иногда это требование ломается, если вы являетесь подклассом и переопределяете равные в родительском классе и в подклассе. Часто equals содержит код типа if (!getClass().equals(other.getClass())) return false;, который, по крайней мере, гарантирует, что разные типы объектов не равны друг другу.

  • Если вы переопределите equals, вы также ДОЛЖНЫ переопределить hashCode так, чтобы выполнялось следующее выражение: if (a.equals(b)) assert a.hashCode() == b.hashCode(). То есть хэш-код двух объектов, равных друг другу, должен быть одинаковым. Обратите внимание, что обратное неверно: два объекта, имеющих один и тот же хэш-код, могут быть или не быть равными друг другу. Усушно, это требование позаботится, получив хэш-код из тех же свойств, которые используются для определения равенства объекта.

В вашем случае метод hashCode может быть:

public int hashCode() {
  return getFirstName().hashCode() +
    getLastName().hashCode() +
    getPhoneHome().hashCode() +
    getCellPhone().hashCode();
}
  • Если вы реализуете Comparable, который сравнивает два объекта, если они меньше, больше или равно друг другу, a.compareTo(b) == 0 должен быть истинным тогда и только тогда, когда a.equalTo(b) == true

Во многих IDE (например, Eclipse, IntelliJ IDEA, NetBeans) есть функции, которые генерируют как equals, так и hashCode для вас, тем самым избавляя вас от утомительной и, возможно, подверженной ошибкам работы.

Ответ 4

Метод equals используется, когда вы хотите знать, эквивалентны ли два объекта по любому определению, которое объекты находят подходящим. Например, для объектов String эквивалентность заключается в том, представляют ли два объекта одну и ту же строку символов. Таким образом, классы часто предоставляют собственную реализацию equals, которая работает так, как это естественно для этого класса.

Метод equals отличается от == тем, что последние проверяют идентичность объекта, то есть, являются ли объекты одинаковыми (что не обязательно совпадает с эквивалентом).

Ответ 5

Он позволяет вам переопределить, какие объекты равны, а какие нет, например, вы можете определить, что два объекта Person равны, если Person.ID совпадает или если Weight равно в зависимости от логики в вашем приложении.

Смотрите следующее: Переопределение метода java equals() quirk