本文将带你了解如何快速的找出两个相似度非常高的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,System,数据量,集合,listA,listB From: https://blog.51cto.com/zhanjq/5885531