java 集合list取交集(retainAll),并集(addAll),差集(removeAll)方法解析

方法

现有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 it = iterator();  //遍历集合
        while (it.hasNext()) {
            if (!c.contains(it.next())) {  //集合c不含有此元素,则删除
                it.remove();
                modified = true;
            }
        }
        return modified;   //所以最后剩下的都是两个集合共有元素即交集
    }
addAll取并集:
public boolean addAll(Collection 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 requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

你可能感兴趣的:(java,java)