# 猜想
- 心血来潮,也是有需要使用到集合的交集,对List的Stream求交集,retainAll求交集,以及guava的求交集方式进行了测试
@Test
public void testGuava(){
String a = "1,7,3";
String b = "2,5,8";
int num = 20000;
for (int i = 0; i <num ; i++) {
a = String.format("%s,%s",a,(int) (Math.random() * num));
b = String.format("%s,%s",b,(int) (Math.random() * num));
}
String[] arrayA = a.split(",");
String[] arrayB = b.split(",");
Set<String> setA = Arrays.stream(arrayA).collect(Collectors.toSet());
Set<String> setB = Arrays.stream(arrayB).collect(Collectors.toSet());
List<String> listA = Arrays.stream(arrayA).distinct().collect(Collectors.toList());
List<String> listB = Arrays.stream(arrayB).distinct().collect(Collectors.toList());
long l = System.currentTimeMillis();
System.out.println(listA.stream().filter(listB::contains).collect(Collectors.toList()).size());
long l1 = System.currentTimeMillis();
System.out.println(String.format("%s个数字:stream方法耗时:%s",num,l1-l));
System.out.println(Sets.intersection(setA, setB).size());
long l2 = System.currentTimeMillis();
System.out.println(String.format("%s个数字:Guava方法耗时:%s",num,l2-l1));
listA.retainAll(listB);
System.out.println(listA.size());
System.out.println(String.format("%s个数字:retainAll方法耗时:%s",num,System.currentTimeMillis()-l2));
}
# 测试结果
203
500个数字:stream方法耗时:4
203
500个数字:Guava方法耗时:38
203
500个数字:retainAll方法耗时:2
2013
5000个数字:stream方法耗时:70
2013
5000个数字:Guava方法耗时:37
2013
5000个数字:retainAll方法耗时:32
8082
20000个数字:stream方法耗时:777
8082
20000个数字:Guava方法耗时:31
8082
20000个数字:retainAll方法耗时:771
# 结论
- 在数据的规模小的时候,使用List的Stream方法和retainAll效率更高,但当数据量大了之后,Guava的方法就拉开了一个档次
← 锁