从Java中的集合交集探寻空间换时间的案例(对于我们处理大数据量可做参考)

目的:

(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可比的。

缺点:

会照成大量的临时数据产生。

其他思路:

可以拆分成多线程执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值