Нет. contains()
не может делать ничего, кроме использования Object.equals
, потому что это требуется спецификацией.
Нельзя сказать, что не разумно хотеть понятие содержимого для массива; просто вы не можете перегрузить существующую концепцию.
Вы можете просто создать метод stati c:
static <T> boolean containsArray(List<? extends T[]> list, T[] query) {
return list.stream().anyMatch(e -> Arrays.equals(e, query));
}
И затем вызывать его там, где в противном случае вы вызываете list.contains(query)
.
Это имеет то преимущество, что работает для любого списка (с элементами массива ссылочного типа): вам не нужно специально его создавать, просто обновите эти специализированные сравнения.
(Вышеприведенное будет работать для любого массива ссылочного типа. Вам нужно будет специализировать его для массивов примитивного типа).
Он также имеет то преимущество, что вам не нужно иметь дело с острые последствия, выделенные Стивеном C (например, как работают indexOf
, remove
et c).
Есть еще одна альтернатива: используйте тип элемента списка, который поддерживает равных "правильно". Например, вы можете обернуть массивы, используя Arrays.asList
, чтобы сохранить их в списке, так что у вас есть List<List<T>>
вместо List<T[]>
.
Это было бы довольно агрессивным изменением: это потребовало бы изменения тип списка в вашем коде; вы не указали, насколько широко используется ваш список массивов.