Java高效找出两个大数据量List集合中的不同元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java高效找出两个大数据量List集合中的不同元素相关的知识,希望对你有一定的参考价值。

本文将带你了解如何快速的找出两个相似度非常高的List集合里的不同元素。主要通过Java API、List集合双层遍历比较不同、借助Map集合查找三种方式,以及他们之间的执行效率情况,话不多说,开搞! 集合初始化方法:

    /**
     * 制造任意个元素的的List集合
     * @param size List集合的size
     * @return List<String>
     */
    private static List<String> dataList(int size) 
        List<String> dataList = new ArrayList<>();
        for (int i = 0; i < size; i++) 
            dataList.add("" + i);
        
        return dataList;
    

测试数据为集合A: 1千, 1万, 10万,1百万, 1千万的数据量.

  • 集合B比集合A多初始化六条数据,集合A添加一条特有的数据。
  • 测试数据使用空字符串 + 自然数的方式。

JavaAPI过滤(不推荐)

1千数据量

        List<String> listA = dataList(1000);
        //集合A添加一个集合B没有的元素
        listA.add("onlyA10086");
        List<String> listB = dataList(1006);
        Long startTime = System.currentTimeMillis();
        // 复制集合A和集合B作为备份
        List<String> listABak = new ArrayList<>(listA);
        List<String> listBBak = new ArrayList<>(listB);
        // 集合B存在,集合A不存在的元素
        listB.removeAll(listA);
        // 集合A存在,集合B不存在的元素
        listA.removeAll(listBBak);
        Long endTime = System.currentTimeMillis();
        List<String> differentList = new ArrayList<>();
        differentList.addAll(listB);
        differentList.addAll(listA);
        System.out.println("集合A和集合B不同的元素:"+differentList);
        Long costTime = endTime-startTime;
        System.out.println("比对耗时:"+costTime+"毫秒。");

耗时:22毫秒

1万数据量

        List<String> listA = dataList(10000);
        //集合A添加一个集合B没有的元素
        listA.add("onlyA10086");
        List<String> listB = dataList(10006);
        Long startTime = System.currentTimeMillis();
        // 复制集合A和集合B作为备份
        List<String> listABak = new ArrayList<>(listA);
        List<String> listBBak = new ArrayList<>(listB);
        // 集合B存在,集合A不存在的元素
        listB.removeAll(listA);
        // 集合A存在,集合B不存在的元素
        listA.removeAll(listBBak);
        Long endTime = System.currentTimeMillis();
        List<String> differentList = new ArrayList<>();
        differentList.addAll(listB);
        differentList.addAll(listA);
        System.out.println("集合A和集合B不同的元素:"+differentList);
        Long costTime = endTime-startTime;
        System.out.println("比对耗时:"+costTime+"毫秒。");

耗时:613毫秒

10万数据量

        List<String> listA = dataList(100000);
        //集合A添加一个集合B没有的元素
        listA.add("onlyA10086");
        List<String> listB = dataList(100006);
        Long startTime = System.currentTimeMillis();
        // 复制集合A和集合B作为备份
        List<String> listABak = new ArrayList<>(listA);
        List<String> listBBak = new ArrayList<>(listB);
        // 集合B存在,集合A不存在的元素
        listB.removeAll(listA);
        // 集合A存在,集合B不存在的元素
        listA.removeAll(listBBak);
        Long endTime = System.currentTimeMillis();
        List<String> differentList = new ArrayList<>();
        differentList.addAll(listB);
        differentList.addAll(listA);
        System.out.println("集合A和集合B不同的元素:"+differentList);
        Long costTime = endTime-startTime;
        System.out.println("比对耗时:"+costTime+"毫秒。");

可以看出来十万数据量级别已经比较慢了,需要77秒

100万数据量

emmm估计挺慢,不继续验证了。

以上是关于Java高效找出两个大数据量List集合中的不同元素的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 集合框架优化之list.removeAll大数据量优化

大数据量情况下高效比较两个list

两个集合找出相同和不同元素?

Java大集合求交集的方法比较

java 中如何 找出两个集合中的不重复的元素

两个list求差集