У меня есть класс, для которого я реализовал собственный метод hashCode () и equals (Object), используя генератор методов Eclipse.Каждый объект класса имеет поле String с именем mUid
, которое должно быть уникальным и достаточным для определения равенства.Переопределенные методы выглядят так:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((mUid == null) ? 0 : mUid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DataSource other = (DataSource) obj;
if (mUid == null) {
if (other.mUid != null)
return false;
} else if (!mUid.equals(other.mUid))
return false;
return true;
}
Но по какой-то причине, когда я сравниваю два объекта моего класса, он всегда возвращает false.Я прошел через код с помощью отладчика и могу определить, что строки mUid одинаковы.Но мой метод equals(Object)
всегда возвращает false в строке
if (!mUid.equals(other.mUid)) {return false;}
.
Это означает, что метод String equals () сообщает, что строки не равны.Но в отладчике я вижу, что даже их хэш-коды равны.
Вот скриншот отладки:
Может кто-нибудь объяснить, что происходит?Спасибо.
Обновление: это работает!
Следует отметить, что я не вызываю метод equals (...) напрямую, а скорее из List<DataSource> list.contains(DataSource)
.Оказывается, что если я пошагово выполняю код equals(Object)
, он показывает, что он возвращает false для сравнения каждого объекта в списке (даже если есть совпадение).Но, похоже, метод List.contains()
возвращает правильное значение (true или false) в любом случае.Не знаю, почему это так, но это работает.После if(list.contains(dataSource));
у меня была лишняя точка с запятой, поэтому я не мог правильно увидеть, что contains()
работает нормально. Спасибо за вашу помощь всем .