# 猜想

  • 心血来潮,也是有需要使用到集合的交集,对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的方法就拉开了一个档次
最后编辑时间: 12/21/2020, 8:56:16 PM