java百万数据集list.removeAll
以下是未性能极差的代码👇(辣鸡代码)
以下是测试代码👇(优化代码)
以下是测试数据下
代码讲解
1.842行custmLabelVList(旧客户)数量有八十六多万条
2.849行custmIds(新客户)数量八十七万多条
3.851行使用旧客户剔除新客户取差集(剩下旧客户要删除)
4.851行取出旧客户数据需要用到十几分钟
5.856行使用新客户剔除旧客户去差集(剩下的需要新增)
6.856行取出新客户数据则要两个多小时
这就很tm离谱了
7.然后加了个工具类,以及优化了850行代码(list转hashset)
/**
* @Description: list 剔除 指定值
* @param data 数据源
* @param beDelete 被剔除的数据
* @return
* @author: zq
* @date: 2019年12月26日下午4:20:59
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List removeAll(List data, List beDelete) {
LinkedList linkedList = new LinkedList(data);
HashSet hashSet = new HashSet(beDelete);
Iterator it = linkedList.iterator();
while(it.hasNext()){
if(hashSet.contains(it.next())){
it.remove();
}
}
return linkedList;
}
8.可以看到修改后的list操作时间和之前的完全不是一个概念。这就是巧用ArrayList和LinkedList的区别了
9.ArrayList是基于数组实现的,循环遍历、读取效率高,插入和删除效率低,因为每次插入和删除都需要移动数组下标
10.LinkedList是由双链,删除不需要移动数组元素,只需要修改链表节点指针
11.使用Iterator迭代器,只用对iterator进行循环,然后删除的元素,无需关注下标的问题,遍历效率高
总结
可以看到优化后的代码和优化前的执行时间完全不是一个档次,集合是个坎大家一定要了解
2020-2-25
更快的办法用java8 lambda表达式更快。。。。
List list= new ArrayList();
list.stream().forEach(x -> {
System.out.println(x);
});