Эффективно вычислить пересечение двух множеств в Java?

Каков наиболее эффективный способ найти размер пересечения двух не разреженных наборов в 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();
}
55
задан bsiamionau 8 May 2013 в 04:46
поделиться