目的:
(1)双从For循环的复杂度
(2)集合转Map的降低复杂度的方法以及注意点
一:背景
在一个数据量为2W的A集合中查询数据量2W的B集合中相同ID的数据。
1.准备:模拟出2个集合
public class Persion {
//ID
private Integer id ;
//姓名
private String name ;
//没写Set/get等方法
}
//随机创建2w个对象
List<Persion> oldList = new ArrayList<Persion>();
for(int i = 0 ; i < 20000 ;i++) {
oldList.add(new Persion(i, "monxz"+i));
}
//随机再创建2w个对象
List<Persion> newList = new ArrayList<Persion>();
for(int i = 19000 ; i < 40000 ;i++) {
newList.add(new Persion(i, "monxz"+i));
}
2.常规做法:双重for循环
//寻找交集
int count = 0 ;
List<Persion> resList = new ArrayList<Persion>();
//双重for循环
for(Persion p1 : oldList ) {
for(Persion p2 : newList) {
count++;
if((p1.getId() - p2.getId()) == 0) {
resList.add(p1);
}
}
}
3.转Map查询
//先转成Map,然后循环遍历(这是一个空间换时间的典例)
Map<Integer, Persion> map = new HashMap<Integer, Persion>();
for(Persion p1 : oldList) {
count++;
map.put(p1.getId(), p1);
}
System.err.println(map.size());
for(Persion p2 : newList) {
count++;
if(map.get(p2.getId()) != null ) {
resList.add(map.get(p2.getId()));
}
}
二:加大数据量
1.将上述创建对象的数字*10
2.执行2个方法的耗时
双重for的结果就不放了(10多分钟没出来)
三:总结
将list转Map的朱永就是利用Map的存储结构Hash的底层。
优点:
当数据量 > 10w时这种方法性能简直不是for...for可比的。
缺点:
会照成大量的临时数据产生。
其他思路:
可以拆分成多线程执行