解决retainAll()超级慢的方法

例如List<V> aa 和List<V> bb,要求两个列表的交集

数据量上百万的时候retainAll()超级超级慢,没有解决办法,因为reatainAll的原理就是遍历外层列表比如aa(aa通常是数量较少的列表),再在循环里判断bb是否包含当前正遍历到的元素aa.get(i),而判断是否包含时contains方法又是一个很笨重的办法,它的原理是去获取元素的下标indexOf,即在列表中依次遍历匹配目标元素直至找到相同的元素...太慢了...慢的我失去耐心等不到结果...

但是可以切换思路,换个方法解决求交集的问题。

使用唯一标识作为Map的key存储两个列表元素,将求List<V> aa 和List<V> bb 的交集问题,改成求Map<K,V>的交集,遍历Map.Entry,判断if(bb.containsKey(entry.getKey())){},如下

Map<String,String> aa = new HashMap<>();
Map<String,String> bb = new HashMap<>();

for(int i=0; i<1000000;i++){
    aa.put("stringggg"+i,"stringggg"+i);
}

for(int j=0; j<1000000;j++){
    bb.put("bbstringggg"+j,"bbstringggg"+j);
}
for(int k=0; k<1000000;k++){
	bb.put("stringggg"+k,"stringggg"+k);
}
System.out.println(System.currentTimeMillis()+"  start retainAll by Map...");
List<String> cc = new ArrayList<>();
for(Map.Entry<String,String> ee:aa.entrySet()){
	if(bb.containsKey(ee.getKey())){
		cc.add(ee.getKey());
	}
}
System.out.println(System.currentTimeMillis()+"  end retainAll by Map..."+ cc.size());

输出:

183ms,感动

原因就是HashMap的containsKey方法,它使用hashcode查找集合,大大减少元素比较次数,类比ListArrayList的两层循环,相当于省去了内层循环,提高查找效率!这样使用HashMap求交集会快速许多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值