一、优化内外层比较的结构

『外层遍历 + 内层遍历』查找:
复杂度 O (NM) ,一般使用 contains () 检查是否包含

『外层遍历 + 内层 Hash』查找:
复杂度 O (N),一般将内层 List 转化为 HashSet 实现

『外层遍历 + 内层 bitMap』查找:
复杂度 O (N),一般将内层 List 转化为字节映射实现

package com.jw.demo.com.colllection.test;import org.junit.Test;import java.util.*;public class SetOperation {@Testpublic void setOperation() {int size = 5000000;HashSet<Long> la = new HashSet<>(size);HashSet<Long> lb = new HashSet<>(size);for (int i = 0; i < 300000; i++) {la.add(Long.valueOf(i));}for (int i = 0; i < 300000; i++) {lb.add(Long.valueOf(i));}System.out.println("2.『外层Hash+内层list』查找:");outHastSetInnerHashSet(la, new ArrayList<>(lb));System.out.println("重复的数据有:"+la.size());//『外层list+内层Hash』查找:System.out.println("2.『外层list+内层Hash』查找:");outArrayListInnerHashSet(new ArrayList<>(la), lb);System.out.println("重复的数据有:"+la.size());System.out.println("2.『外层Hash+内层Hash』查找:");outHashSetInnerHashSet(la,lb);System.out.println("重复的数据有:"+la.size());receiveDefectList(new ArrayList<>(la),new ArrayList<>(lb));}// 外层:HashSet,内层:HashSetprivate void outHastSetInnerHashSet (HashSet<Long>  listA, List<Long> listB) {long begin = System.currentTimeMillis();HashSet<Long> setB = new HashSet<>(listB);listA.retainAll(setB);
//        System.out.println("重复的数据有:"+listA.size());long end = System.currentTimeMillis();System.out.println("[HashSet-ArrayList]RetainAll耗时:" + (end - begin));}// 外层:ArrayList,内层:HashSetprivate void outArrayListInnerHashSet(List<Long> listA, HashSet<Long> listB) {long begin = System.currentTimeMillis();ArrayList<Long> setA = new ArrayList<>(listA);Set<Long> set = new HashSet<>();Long[] arr = set.toArray(new Long[set.size()]);Arrays.sort(arr);setA.retainAll(listB);
//        System.out.println("重复的数据有:"+setA.size());long end = System.currentTimeMillis();System.out.println("[ArrayList-HashSet]RetainAll耗时:" + (end - begin));}private void outHashSetInnerHashSet(HashSet<Long> la, HashSet<Long> lb) {long begin = System.currentTimeMillis();la.retainAll(lb);
//        System.out.println("重复的数据有:"+la.size());long end = System.currentTimeMillis();System.out.println("[HashSet-HashSet]RetainAll耗时:" + (end - begin));}private void receiveDefectList(List<Long> firstArrayList, List<Long> secondArrayList) {long begin = System.currentTimeMillis();List<Long> resultList = new ArrayList<Long>();LinkedList<Long> result = new LinkedList<Long>(firstArrayList);// 大集合用linkedlistHashSet<Long> othHash = new HashSet<Long>(secondArrayList);// 小集合用hashsetIterator<Long> iter = result.iterator();// 采用Iterator迭代器进行数据的操作while(iter.hasNext()){if(othHash.contains(iter.next())){iter.remove();}}resultList = new ArrayList<Long>(result);firstArrayList.clear();resultList.forEach(o-> firstArrayList.add(o));long end = System.currentTimeMillis();System.out.println("[ite-iterator]RetainAll耗时:" + (end - begin));}private  void test3(List<Long> array1,List<Long> array2){Set<Long> set = new HashSet<>();Long[] arr = set.toArray(new Long[set.size()]);Arrays.sort(arr);// 通过HashMap:求两个集合中交集Map<Long,Integer> map=new HashMap<>();for(int i=0;i<Math.min(array1.size(),array2.size());i++){contains(map,array1.get(i));contains(map,array2.get(i));}// 遍历for(Map.Entry<Long, Integer>m:map.entrySet()){if(m.getValue()>1)array1.remove(m.getKey());
//                System.out.println(m.getKey());}}private  void contains(Map<Long,Integer>map,Long k){if(map.containsKey(k)){Integer tmp=map.get(k);tmp++;map.put(k, tmp);}else{map.put(k,1);}}}

二、java交集retainAll 和 Sets.intersection 性能比较(链接)

三、用JDK方法求交集retainAll(链接)

四、利用guava集合求交集(链接)

五、利用bitmap求两个list的交集(链接)

jar包获取地址(点击)

参考链接

1、十万以上数据的两个集合进行交集,差集运算,ArrayList为什么特别慢?HashSet为什么效率如此高?(地址)
2、Java 中大集合 求交集的方法比较(地址)
3、bitmap技术解析:redis与roaringBitnap(地址)
4、一文读懂比BitMap有更好性能的Roaring Bitmap(地址)

杂谈记录——论Long类型的大数据量求交集相关推荐

  1. 大数据集合求交集_通达信北上资金+盘面分析sp版面,智能大数据集合,筹码占比指标...

    大家好,我是金融依依. 最近一直都在给大家分享一些比较实用的sp界面,因为发现很多人了解信息的渠道是非常乱的,很多时候得到的信息还不一定准确,很多界面看的自己眼花缭乱,最后也没能看出个123,所以今天 ...

  2. 大数据集合求交集_Java8 实现ArrayList求交集并集差集

    本文借助Java8的Stream API完成ArrayList集合运算:求交集.并集和差集! public class CollectionUtil {/*** 判断为空*/public static ...

  3. 大数据集合求交集_还记得学生时代数学老师教的“集合”吗?

    犹记得老师敲着黑板,强调"集合"的特性:无序.不重复,没想到多年后在咱们编程中派上了用场. 集合 # 数据分析中,经常需要把字符串.列表中的数据去重,怎么办呢?用"集合& ...

  4. Mybatis 大数据量的批量insert解决方案

    前言 通过Mybatis做7000+数据量的批量插入的时候报错了,error log如下: , ('G61010352', '610103199208291214', '学生52', 'G610103 ...

  5. 后端技术杂谈12:捋一捋大数据研发的基本概念

    你了解你的数据吗(开篇) 转自http://www.mdjs.info/2018/03/05/data-warehouse/concept-of-dw/ 0x00 前言 你了解你的数据吗? 前几天突然 ...

  6. mysql scrapy 重复数据_MySQL大数据量表中删除重复记录

    MySQL大数据量表中删除重复记录 最近工作中需要抓取大量新闻,抓取的数据中由于一些原因存在一些重复数据,而整个数据表的记录数接近10万条,大小接近1个G,又在我自己的渣渣本本上,查询速度十分不理想, ...

  7. .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录

    步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页.延迟执行和日志记录 作者:webabcd 介绍 以Northwind为示例数据库,DLIN ...

  8. MySQL数据库如何解决大数据量存储问题

    FROM http://blog.csdn.net/likika2012/article/details/38816037 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存 ...

  9. Oracle大数据量分页通用存储过程

    type refCursorType is REF CURSOR;  --游标类型定义,用于返回数据集 /*********************************************** ...

最新文章

  1. 在windows下配置pthread多线程
  2. 豪取4个SOTA,谷歌魔改Transformer登NeurIPS 2021!一层8个token比1024个还好用
  3. 数据分析工具Pandas(7):数据清洗、合并、转化和重构
  4. id ajax,AJAX_ajax.js里面有内容显示效果,根据ID,ajax.js里面有内容显示效果,根 - phpStudy...
  5. 16位和32位微处理器(4)——Pentium的寄存器及相关机制
  6. Spring : Spring 切面优先级
  7. Java基础篇:简单介绍一下final
  8. 用JavaScript来写浏览器上的应用
  9. BIOS、BootLoader、uboot对比
  10. python3计算运行时间_性能分析之代码运行时间计算——Python timeit 模块 介绍
  11. C++ Lib的生成与调用 生成dll,lib快速的寻找方法
  12. mysql 5.7插入很慢_MySQL进阶——主从复制
  13. 挑战性题目DSCT102:木板切割问题
  14. 5.5matlab曲线拟合(多项式函数拟合)
  15. android h5 qq登录,Android webview一键登录手机QQ(2018.11)
  16. 什么是负载?如何查看服务器的机器负载情况?
  17. Druid (大数据实时统计分析数据存储)
  18. LINK : fatal error LNK1104: 无法打开文件“mfc71.lib”的原因又一例
  19. 美团点评2017校园招聘编程题--取红包
  20. 赶紧收藏3个免费在线资源齐全的网站

热门文章

  1. Flask 自定义命令 类似于django的manage.py
  2. 构建 bilibili 的自动化管理
  3. stm32-通用定时器原理及代码分析
  4. JS打砖块小游戏 canvas绘制
  5. [摘要生成]Boosting Factual Correctness of Abstractive Summarization with Knowledge Graph
  6. Preferences DataStore使用实例
  7. python代码运行助_【分享】中午吃什么,Python摇一摇代码帮助你 | 勤奋的小青蛙...
  8. sql yog出现2013错误
  9. (设计模式四)java设计模式之建造者模式
  10. 2021-03-20 Codeforces Round #708 (Div. 2)