Скажем, я создаю один объект и добавляю его в свой ArrayList
. Если я затем создам другой объект с точно таким же входом конструктора, будет ли contains()
метод оценивать два объекта как одинаковые? Предположим, что конструктор не делает ничего смешного с вводом, и переменные, хранящиеся в обоих объектах, идентичны.
ArrayList<Thing> basket = new ArrayList<Thing>();
Thing thing = new Thing(100);
basket.add(thing);
Thing another = new Thing(100);
basket.contains(another); // true or false?
class Thing {
public int value;
public Thing (int x) {
value = x;
}
equals (Thing x) {
if (x.value == value) return true;
return false;
}
}
Это как это class
должно быть реализовано, чтобы иметь contains()
возвращение true
?
java
object
arraylist
evaluation
Мантас Видутис
источник
источник
Object
вместо aThing
. Если вы этого не сделаете, ваш метод равно не будет использоваться. :)Collections
делать их вещи оптимизированным способом, то естьcontains()
сначала проверяетhashCode
s двух объектов, а затем вызываетequals()
. ЕслиhashCode
s разные (что всегда имеет место для двух разных экземпляровThing
),equals()
метод вызываться не будет. Как правило, когда вы переопределяетеequals()
, вы не должны забыватьhashCode()
также переопределять .Я думаю, что правильные реализации должны быть
источник
if
утверждение не нужно.instanceof
достаточно.object != null
Условие не является необходимым, так какobject instanceof Thing
проверка на предмет того , не нулевое значение тоже.ArrayList использует метод equals, реализованный в классе (класс Thing вашего случая), для сравнения.
источник
Как правило, вы также должны переопределять
hashCode()
каждый раз, когда вы переопределяетеequals()
, даже если только для повышения производительности.HashCode()
решает, в какое «ведро» будет отсортирован ваш объект при сравнении, поэтому любые два объекта, которые имеютequal()
значение true, должны возвращать одно и то жеhashCode
value()
. Я не могу вспомнить поведение по умолчаниюhashCode()
(если он возвращает 0, тогда ваш код должен работать, но медленно, но если он возвращает адрес, то ваш код потерпит неудачу). Я помню много раз, когда мой код не удался, потому что я забыл переопределитьhashCode()
. :)источник
Он использует метод equals для объектов. Таким образом, если переопределение Thing не равно и не использует переменные, хранящиеся в объектах для сравнения, оно не вернет true для
contains()
метода.источник
Вы должны написать:
Теперь это работает;)
источник
Просто хотел заметить, что следующая реализация неверна, когда
value
не является примитивным типом:В этом случае я предлагаю следующее:
источник
Другие авторы обращались к вопросу о том, как работаетве ().
Не менее важным аспектом вашего вопроса является правильная реализация equals (). И ответ на это действительно зависит от того, что составляет объектное равенство для этого конкретного класса. В приведенном вами примере, если у вас есть два разных объекта, каждый из которых имеет х = 5, они равны? Это действительно зависит от того, что вы пытаетесь сделать.
Если вас интересует только равенство объектов, тогда стандартная реализация .equals () (предоставленная Object) использует только идентичность (то есть this == other). Если это то, что вы хотите, то просто не реализуйте equals () в вашем классе (пусть он наследуется от Object). Код, который вы написали, хотя и является правильным, если вы идете за идентичностью, никогда не появится в реальном классе, потому что он не дает никакой выгоды по сравнению с использованием стандартной реализации Object.equals ().
Если вы только начинаете заниматься этим, я настоятельно рекомендую книгу «Эффективная Java» Джошуа Блоха. Это отличное чтение, и оно охватывает такие вещи (плюс, как правильно реализовать equals (), когда вы пытаетесь сделать больше, чем сравнение на основе идентичности)
источник
Ярлык из JavaDoc :
логическое значение содержит (объект o)
Возвращает true, если этот список содержит указанный элемент. Более формально, возвращает true тогда и только тогда, когда этот список содержит хотя бы один элемент e такой, что (o == null? E == null: o.equals (e))
источник