То, что вы хотите, называется пересечением.
Видеть, что:
Пересечение и объединение ArrayLists в Java
Использование коллекции, основанной на хэш-функции, обеспечивает более быстрый метод contains (), особенно для строк, которые имеют оптимизированный хэш-код.
Если вы можете импортировать библиотеки, рассмотрите возможность использования пересечения Sets.inter of Guava.
Edit:
Не знал о методе retainAll.
Обратите внимание, что реализация AbstractCollection, которая, кажется, не переопределена для HashSets и LinkedHashSets:
public boolean retainAll (Коллекция c) {
логическое изменение = ложь;
Iterator it = iterator ();
while (it.hasNext ()) {
if (! c.contains (it.next ())) {
it.remove ();
модифицированный = правда;
}
}
возврат изменен;
}
Что означает, что вы вызываете функции метода () для параметра коллекции!
Это означает, что если вы передадите параметр List, вы получите вызов equals для многих элементов списка для каждой итерации!
Вот почему я не думаю, что приведенные выше реализации с использованием retainAll хороши.
public <T> List<T> intersection(List<T> list1, List<T> list2) {
boolean firstIsBigger = list1.size() > list2.size();
List<T> big = firstIsBigger ? list1:list2;
Set<T> small = firstIsBigger ? new HashSet<T>(list2) : new HashSet<T>(list1);
return big.retainsAll(small)
}
Выбор использования набора для наименьшего списка, потому что быстрее создать набор, а большой список выполняет итерации довольно хорошо ...
Обратите внимание, что один из исходных параметров списка может быть изменен, вы сами должны сделать копию ...