Вопрос-ответ

How does a ArrayList's contains() method evaluate objects?

Как метод ArrayList contains() оценивает объекты?

Допустим, я создаю один объект и добавляю его в свой 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() return true?

Переведено автоматически
Ответ 1

ArrayList implements интерфейс списка.

Если вы посмотрите на Javadoc для List метода contains, вы увидите, что он использует equals() метод для оценки того, являются ли два объекта одинаковыми.

Ответ 2

Я думаю, что правильные реализации должны быть

public class Thing
{
public int value;

public Thing (int x)
{
this.value = x;
}

@Override
public boolean equals(Object object)
{
boolean sameSame = false;

if (object != null && object instanceof Thing)
{
sameSame = this.value == ((Thing) object).value;
}

return sameSame;
}
}
Ответ 3

ArrayList использует метод equals, реализованный в классе (ваш класс case Thing), для выполнения сравнения equals.

Ответ 4

Как правило, вы также должны переопределять hashCode() каждый раз, когда вы переопределяете equals(), даже если просто для повышения производительности. HashCode() решает, в какую "корзину" будет отсортирован ваш объект при выполнении сравнения, поэтому любые два объекта, для которых equal() значение true должно возвращать одинаковое hashCode value(). Я не могу вспомнить поведение по умолчанию hashCode() (если он возвращает 0, то ваш код должен работать, но медленно, но если он возвращает адрес, то ваш код завершится ошибкой). Я помню кучу случаев, когда мой код давал сбой, потому что я забывал переопределить hashCode() хотя. :)

2023-09-26 18:31 java arraylist