Метод List.contains(...)
определен для использования equals(Object)
для определения, содержится ли объект аргумента в списке.Поэтому вам нужно переопределить equals
... при условии, что реализация по умолчанию - это не то, что вам нужно.
Однако вы должны знать, что List.contains(...)
потенциально проверяет аргумент для каждого элемента в списке.Для длинного списка это дорого.В зависимости от деталей вашего приложения, может быть лучше использовать другой тип коллекции (например, HashSet
, TreeSet
или LinkedHashSet
) вместо List
.Если вы используете один из них, ваш класс должен будет переопределить hashCode
или реализовать Comparable
, или вам нужно будет создать отдельный Comparator
... в зависимости от того, что вы выберете.
(Еще несколько советов об альтернативах ... поскольку интересует OP)
Производительность contains
для типа List
, например ArrayList
или LinkedList
, равна O(N)
.Наихудшая стоимость вызова contains
прямо пропорциональна длине списка.
Для TreeSet
производительность наихудшего случая contains
пропорциональна log2(N)
.
Для HashSet
или LinkedHashSet
средняя производительность contains
является постоянной величиной, не зависящей от размера коллекции, но наихудшая производительность составляет O(N)
.(Наихудший случай производительности возникает, если вы: 1) внедрили плохую функцию hashcode()
, которая хэширует все до небольшого числа значений, или 2) настроили параметр «коэффициент загрузки», чтобы хеш-таблица не изменяла размер автоматически при ее росте..)
Недостатки использования Set
классов:
- они комплекты ;т.е. вы не можете поместить два или более «равных» объекта в коллекцию, и
- они не могут быть проиндексированы;например,
get(pos)
метод отсутствует, а - некоторые классы
Set
даже не сохраняют порядок вставки.
Эти проблемы необходимо учитывать при принятии решения о том, какая коллекциякласс для использования.