一、本文介绍两种写法

1原生写法

2com.google.guava写法
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>

二、代码

import com.google.common.collect.Sets;

import java.util.HashSet;
import java.util.Set;

/**
* java求集合的交集、差集和并集
*/
public class CollectionOperation {

public static void main(String[] args) {
Set<Integer> result = new HashSet<Integer>();

//双括号语法 -> 本质是: 匿名内部类 + 实例化代码块
//改写之后的代码就非常容易理解了。显然这是在HashSet的构造器中写了一个匿名内部类,这个匿名内部类含有一个实例初始化块
//初始化块的内容是三个add()函数,向被初始化的this指向的HashSet中添加了三个元素。
Set<Integer> set1 = new HashSet<Integer>() {
private static final long serialVersionUID = 1L;

{
add(1);
add(3);
add(5);
}
};

Set<Integer> set2 = new HashSet<Integer>() {
private static final long serialVersionUID = 1L;

{
add(1);
add(2);
add(3);
}
};
System.out.println("set1 " + set1);
System.out.println("set2 " + set2);
//原生写法
System.out.println("原生写法 ===================");
test1(result, set1, set2);

//com.google.guava写法
System.out.println("com.google.guava写法 ===================");
test2(result, set1, set2);

}

public static void test1(Set<Integer> result, Set<Integer> set1, Set<Integer> set2) {
//交集
result.clear();
result.addAll(set1);
result.retainAll(set2);
System.out.println("交集:" + result);

//差集
result.clear();
result.addAll(set1);
result.removeAll(set2);
System.out.println("差集:" + result);

//并集
result.clear();
result.addAll(set1);
result.addAll(set2);
System.out.println("并集:" + result);
}

public static void test2(Set<Integer> result, Set<Integer> set1, Set<Integer> set2) {
//交集
Sets.SetView<Integer> intersection = Sets.intersection(set1, set2);
System.out.println("交集:" + intersection.immutableCopy()); // 可以使用交集,但不可变拷贝的读取效率更高

//差集
Sets.SetView<Integer> difference = Sets.difference(set1, set2);
System.out.println("差集:" + difference.immutableCopy());

//并集
Sets.SetView<Integer> union = Sets.union(set1, set2);
System.out.println("并集:" + union.immutableCopy());
}

}

三、输出

set1 [1, 3, 5]
set2 [1, 2, 3]
原生写法 ===================
交集:[1, 3]
差集:[5]
并集:[1, 2, 3, 5]
com.google.guava写法 ===================
交集:[1, 3]
差集:[5]
并集:[1, 3, 5, 2]