Каков наиболее эффективный способ найти размер пересечения двух не разреженных наборов в Java? Это операция, которую я буду называть большими множествами очень много раз, поэтому оптимизация важна. Я не могу изменить исходные наборы.
Я просмотрел Apache Commons CollectionUtils.intersection, который выглядит довольно медленным. Мой текущий подход состоит в том, чтобы взять меньший из двух наборов, клонировать его, а затем вызвать .retainAll на большее из двух наборов.
public static int getIntersection(Set<Long> set1, Set<Long> set2) {
boolean set1IsLarger = set1.size() > set2.size();
Set<Long> cloneSet = new HashSet<Long>(set1IsLarger ? set2 : set1);
cloneSet.retainAll(set1IsLarger ? set1 : set2);
return cloneSet.size();
}