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

Как сравнить два java-объекта

У меня есть два java-объекта, которые создаются из одного класса.

MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();

Если я установил оба их свойства на одни и те же значения, а затем проверим, что они одинаковы

if(myClass1 == myClass2){
   // objects match
   ...

}

if(myClass1.equals(myClass2)){
   // objects match
   ...

}

Однако ни один из этих подходов не возвращает истинное значение. Я проверил свойства каждого и они совпадают.

Как сравнить эти два объекта, чтобы убедиться, что они идентичны?

4b9b3361

Ответ 1

Вам нужно предоставить свою собственную реализацию equals() в MyClass.

@Override
public boolean equals(Object other) {
    if (!(other instanceof MyClass)) {
        return false;
    }

    MyClass that = (MyClass) other;

    // Custom equality check here.
    return this.field1.equals(that.field1)
        && this.field2.equals(that.field2);
}

Вы также должны переопределить hashCode(), если есть вероятность того, что ваши объекты будут использоваться в хеш-таблице. A разумная реализация заключалась бы в объединении хэш-кодов полей объекта с чем-то вроде:

@Override
public int hashCode() {
    int hashCode = 1;

    hashCode = hashCode * 37 + this.field1.hashCode();
    hashCode = hashCode * 37 + this.field2.hashCode();

    return hashCode;
}

Подробнее о реализации хеш-функции см. этот вопрос.

Ответ 2

Вам нужно переопределить equals и hashCode.
equals будет сравнивать объекты для равенства в соответствии с вашими свойствами и hashCode является обязательным для правильного использования ваших объектов в Collections и Maps

Ответ 3

Вы должны правильно переопределить метод equals() из класса Object

Изменить. Я думаю, что мой первый ответ был неправильно понят, вероятно, потому, что я не был слишком точным. Поэтому я решил добавить дополнительные пояснения.

Почему вы должны переопределить equals()? Хорошо, потому что это в домене разработчика, чтобы решить, что означает, что для двух объектов будут равными. Для большинства случаев стандартного равенства недостаточно.

Например, представьте, что у вас есть HashMap, чьи ключи имеют тип Person. У каждого человека есть имя и адрес. Теперь вы можете найти подробный bean с помощью ключа. Проблема в том, что вы обычно не можете создать экземпляр с той же ссылкой, что и на карте. Что вы делаете, так это создать еще один экземпляр класса Person. Очевидно, оператор == не будет работать здесь, и вы должны использовать equals().

Но теперь мы приходим к другой проблеме. Представьте себе, что ваша коллекция очень большая, и вы хотите выполнить поиск. Наивная реализация сравнивала бы ваш ключевой объект с каждым экземпляром на карте с помощью equals(). Это, однако, было бы очень экспансивным. И вот идет hashCode(). Как отмечали другие, hashcode - это единственный номер, который не обязательно должен быть уникальным. Важным требованием является то, что всякий раз, когда equals() дает true для двух объектов, hashCode() должен возвращать одинаковое значение для обоих из них. Обратная импликация не выполняется, что хорошо, потому что hashcode разделяет наши ключи на ведра. У нас есть небольшое количество экземпляров класса Person в одном ведре. Когда мы выполняем поиск, алгоритм может сразу перейти в правильное ведро и только теперь выполнить равный для каждого экземпляра. Таким образом, реализация hashCode() должна распределять объекты как можно более равномерно по ковшим.

Есть еще одна точка. Некоторые коллекции требуют правильной реализации метода hashCode() в классах, которые используются как ключи не только по соображениям производительности. Примеры: HashSet и LinkedHashSet. Если они не переопределяют hashCode(), объект по умолчанию Метод hashCode() позволит нескольким объектам, которые вы можете считать "значимо равный ", который должен быть добавлен в ваш" no duplicates allowed ".

Некоторые коллекции, которые используют hashCode()

  • HashSet
  • LinkedHashSet
  • HashMap

Посмотрите на эти два класса из сообщества apache, которые позволят вам легко реализовать equals() и hashCode()

Ответ 4

Вам нужно реализовать метод equals() в MyClass.

Причина, по которой == не работала, это проверка того, что они ссылаются на один и тот же экземпляр. Поскольку вы сделали new для каждого, каждый из них является другим экземпляром.

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

Обратите внимание, что вы также должны реализовать hashcode(), если вы собираетесь реализовать equals(), потому что много java.util Collections ожидают этого.

Ответ 5

1) == оценивает ссылочное равенство в этом случае
2) im не слишком уверен в равных, но почему бы не просто переопределить метод сравнения и установить его в MyClass?