当前位置:首页 > 服务端 > 【Java编程系列】使用List集合对百万数据量高效快速过滤去重筛选

【Java编程系列】使用List集合对百万数据量高效快速过滤去重筛选

热门系列:


1.序言

前段时间,接到一个需求。需要将微信公众号的粉丝批量分组。当时需要分组的粉丝用户量达到250W左右,但通过和我们的业务数据库中筛选出来的不合格用户粉丝,需要从250W粉丝中过滤去重。不合格的粉丝数有80W条左右,也就是最终需要筛选出需要分组的粉丝数为170W左右。如此一下,两个大数据集合对比筛选就需要考虑效率问题了!


2.过程

①一开始尝试了一下双重for循环大法,那结果,酸爽无比。程序直接把CPU喂饱了。。。。如此肯定是不可取的。

②使用Iterator迭代器,通过单循,并使用list的contains方法,来筛选。代码如下:

Iterator fensiIterator = fensiList.iterator();
String temp = null;
while (fensiIterator.hasNext()){
	temp = fensiIterator.next().toString();
	if(openIds.contains(temp)){
		fensiIterator.remove();
	}
}

效率也很差,但比第一种稍微好一丢丢

③加强版来啦(推荐)!!!!先上代码:

//250W数据list集合转换成set集合
HashSet fensiSet = new HashSet(fensiList);
//80W从数据库筛选出来不合符条件,需要过滤掉的用户list集合
HashSet removeSet = new HashSet(openIds);
//去重操作
fensiSet.removeAll(removeSet);
//清空原有list,并装入过滤后的数据set集合
fensiList.clear();
fensiList.addAll(fensiSet);

已经加上了注释,大家应该可以一目了然吧!

咱们来分析一下,为啥set如此之快!查贴发现,原来set的HashSet.contains()方法,底层是通过HashMap来实现的。而HashMap的查找速度是很快的。虽然list也有removeAll()方法,但是与set的removeAll()方法相比,底层实现不同,也导致效率差异明显。

 

本博客皆为学习、分享、探讨为本,欢迎各位朋友评论、点赞、收藏、关注,一起加油!

【Java编程系列】使用List集合对百万数据量高效快速过滤去重筛选 _ JavaClub全栈架构师技术笔记

 

作者:善良勤劳勇敢而又聪明的老杨
来源链接:https://blog.csdn.net/yy339452689/article/details/105657691

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/68715.html

标签: ListJava
分享给朋友: