/**
* 制造任意个元素的的List集合
* @param size List集合的size
* @return List
*/
private static List dataList(int size) {
List dataList = new ArrayList();
for (int i = 0; i
测试数据为集合A: 1千, 1万, 10万,1百万, 1千万的数据量.
集合B比集合A多初始化六条数据,集合A添加一条特有的数据。
测试数据使用空字符串 + 自然数的方式。
JavaAPI过滤(不推荐)
1千数据量
List listA = dataList(1000);
//集合A添加一个集合B没有的元素
listA.add("onlyA10086");
List listB = dataList(1006);
Long startTime = System.currentTimeMillis();
// 复制集合A和集合B作为备份
List listABak = new ArrayList(listA);
List listBBak = new ArrayList(listB);
// 集合B存在,集合A不存在的元素
listB.removeAll(listA);
// 集合A存在,集合B不存在的元素
listA.removeAll(listBBak);
Long endTime = System.currentTimeMillis();
List 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 listA = dataList(10000);
//集合A添加一个集合B没有的元素
listA.add("onlyA10086");
List listB = dataList(10006);
Long startTime = System.currentTimeMillis();
// 复制集合A和集合B作为备份
List listABak = new ArrayList(listA);
List listBBak = new ArrayList(listB);
// 集合B存在,集合A不存在的元素
listB.removeAll(listA);
// 集合A存在,集合B不存在的元素
listA.removeAll(listBBak);
Long endTime = System.currentTimeMillis();
List 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 listA = dataList(100000);
//集合A添加一个集合B没有的元素
listA.add("onlyA10086");
List listB = dataList(100006);
Long startTime = System.currentTimeMillis();
// 复制集合A和集合B作为备份
List listABak = new ArrayList(listA);
List listBBak = new ArrayList(listB);
// 集合B存在,集合A不存在的元素
listB.removeAll(listA);
// 集合A存在,集合B不存在的元素
listA.removeAll(listBBak);
Long endTime = System.currentTimeMillis();
List 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估计挺慢,不继续验证了。
为什么在数据量增大的时候,这种方法性能下降的这么明显? 我们不妨来看一下removeAll的源码:
public boolean removeAll(Collection> c) {
// 先判空,然后执行批量remove
Objects.requireNonNull(c);
return batchRemove(c, false);
}