方法
现有2个set集合,list1和list2;
交集:list1.retainAll(list2); —>此时list1即为两个集合的交集
并集:list1.addAll(list2); —>此时list1即为两个集合的并集
差集:list1.removeAll(list2); —>此时list1即为两个集合的差集
举例
Set list1=new HashSet<>();
list1.add(1);
list1.add(2);
list1.add(3);
Set list2=new HashSet<>();
list2.add(2);
list2.add(3);
list2.add(4);
例1:list1.retainAll(list2);
System.out.println(list1); //[2, 3] 即为两个集合交集
例2:list1.addAll(list2);
System.out.println(list1); //[1, 2, 3, 4] 即为两个集合并集
例3:list1.removeAll(list2);
System.out.println(list1); //[1] 即为集合list1的差集
例4:list2.removeAll(list1);
System.out.println(list2); //[4] 即为集合list2的差集
源码
retainAll取交集:
public boolean retainAll(Collection<?> c) {
Objects.requireNonNull(c); //排除NPE(详见下方注意事项)
boolean modified = false;
Iterator<E> it = iterator(); //遍历集合
while (it.hasNext()) {
if (!c.contains(it.next())) { //集合c不含有此元素,则删除
it.remove();
modified = true;
}
}
return modified; //所以最后剩下的都是两个集合共有元素即交集
}
addAll取并集:
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c) //遍历元素添加
if (add(e))
modified = true;
return modified;
}
removeAll取差集:
public boolean removeAll(Collection<?> c) {
Objects.requireNonNull(c); //排除NPE(详见下方注意事项)
boolean modified = false;
if (size() > c.size()) { //若集合c较小,则遍历集合c
for (Iterator<?> i = c.iterator(); i.hasNext(); )
modified |= remove(i.next()); //若某元素两个集合都含有,则删除
} else {
for (Iterator<?> i = iterator(); i.hasNext(); ) { //若集合c较大,则遍历较小集合
if (c.contains(i.next())) {
i.remove();
modified = true;
}
}
}
return modified; //删除所有共有元素,结果即为差集
}
注意事项
1、addAll() 方法为两个集合并集;
若两个集合为ArrayList,则并集可能出现重复元素;Set集合由于本身特性相当于自动去重;
2、Objects.requireNonNull( c );
源码中该句代码用于检测空指针,若集合c为null,则抛出空指针异常。源码如下:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}