Calcola in modo efficiente l’intersezione di due insiemi in Java?

Qual è il modo più efficace per trovare la dimensione dell’intersezione di due insiemi non sparsi in Java? Questa è un’operazione che chiamerò su grandi serie un numero molto grande di volte, quindi l’ottimizzazione è importante. Non riesco a modificare i set originali.

Ho guardato Apache Commons CollectionUtils.intersection che sembra essere piuttosto lento. Il mio attuale approccio è quello di prendere il più piccolo dei due set, clonarlo e quindi chiamare .retainAll sul più grande dei due set.

public static int getIntersection(Set set1, Set set2) { boolean set1IsLarger = set1.size() > set2.size(); Set cloneSet = new HashSet(set1IsLarger ? set2 : set1); cloneSet.retainAll(set1IsLarger ? set1 : set2); return cloneSet.size(); }