Java求两集合中元素交集的四种方法对比分析

 更新时间:2023年05月29日 14:45:43   作者:java技术媛  
这篇文章主要介绍了Java求两集合中元素交集的四种方法对比总结,四种求集合中元素交集的方法,按照在处理大量数据的效率来看,使用map集合的特性的方法效率最高,之后是使用Java流的方法,其次是使用for循环和迭代器的方法,需要的朋友可以参考下

最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑到程序运行的时间消耗等问题,

所以写了四种求集合元素交集的方法 今天这篇文章主要是来记录对比一下,这四种方法使用起来的效率问题,

方法一,求两个集合的交集【普通for循环】

这种方法是最普通的进行for循环比较的方法。利用集合的contains方法,来对比第二个集合中是否存在相同的元素的方法,同时将交集结果返回。

代码示例如下:

/**
    * 方法1,求两个集合的交集
    *
    * @param arr1
    * @param arr2
    * @return
    */
   public List<Object> intersectionForList_1(List<Object> arr1, List<Object> arr2) {
       long startTime = System.currentTimeMillis();
       List<Object> result = new ArrayList<>();
       for (Object arr : arr1) {
           if (arr2.contains(arr)) {
               result.add(arr);
           }
       }
       long endTime = System.currentTimeMillis();
       log.info("intersectionForList_1:" + (endTime - startTime));
       return result;
   }

方法二,求两个集合交集,(迭代器)

这种方法使用的是list集合的迭代器的方法,其实原理和for是一样的,方法的核心也和for循环是一样的,只是外层循环的方法不一样,所以它和上面第一种方法的效果是一样的。

代码示例如下:

 
  /**
   * 方法2,求两个集合交集,(迭代器)
   *
   * @param arr1
   * @param arr2
   * @return
   */
  public List<Object> intersectionForList_2(List<Object> arr1, List<Object> arr2) {
      long startTime = System.currentTimeMillis();
      List<Object> resultList = new ArrayList<>();
      List<Object> maxList;
      List<Object> minList;
      if (arr1.size()>arr2.size()){
          maxList = arr1;
          minList = arr2;
      }else {
          maxList = arr2;
          minList = arr1;
      }
      Iterator<Object> iterator = maxList.iterator();
      while (iterator.hasNext()){
          Object next = iterator.next();
          if (minList.contains(next)){
              resultList.add(next);
          }
      }
      long endTime = System.currentTimeMillis();
      log.info("intersectionForList_2:" + (endTime - startTime));
      return resultList;
  }

方法三,求两个集合交集,(map)

这种方法使用的是map的特性,首先将list集合中的元素依次存入一个map中去,然后再以map的get方法来判断是否存在这样的元素。

这种方法的效率最高,在10万条数据的测试下,这种方法耗时仅仅在十几毫秒,而其他方法在将近一百多毫秒。

在百万条数据进行对比处理的时候,使用map特性的方法时间消耗大概在40毫秒左右,但是其他方法要将近10秒钟,

所以在对于大量数据的处理过程中,还是非常建议使用这种方法的。

代码示例如下:

    /**
     * 方法3,求两个集合交集,(map)
     *
     * @param arr1
     * @param arr2
     * @return
     */
    public List<Object> intersectionForList_3(List<Object> arr1, List<Object> arr2) {
        long startTime = System.currentTimeMillis();
        List<Object> resultList = new ArrayList<>();
        Map<String,Object> map = new HashMap<>();
        arr1.forEach(a1->{
            map.put(a1+"",a1);
        });
        arr2.forEach(a2->{
            Object obj = map.get(a2 + "");
            if (obj!=null){
                resultList.add(obj);
            }
        });
        long endTime = System.currentTimeMillis();
        log.info("intersectionForList_3:" + (endTime-startTime));
        return resultList;
    }

方法四,求两个集合交集,(forEasy)

这种方法使用的是集合的foreasy特性和Java流的特性,使用这种方法可以遍历其中的一个集合,然后再使用contains方法来判断另一个集合中是否存在该集合元素,这种方法的使用效率要优于第一种和第二种方法。

代码示例如下:

    /**
     * 方法4,求两个集合交集,(forEasy)
     * @param arr1
     * @param arr2
     * @return
     */
    public List<Object> intersectionForList_4(List<Object> arr1, List<Object> arr2){
        long startTime = System.currentTimeMillis();
        List<Object> resultList = new ArrayList<>();
        arr1.stream().forEach(a1->{
            if (arr2.contains(a1)){
                resultList.add(a1);
            }
        });
        long endTime = System.currentTimeMillis();
        log.info("intersectionForList_4:" + (endTime-startTime));
        return resultList;
    }

方法总结

总结一下以上四种求集合中元素交集的方法,按照在处理大量数据的效率来看,使用map集合的特性的方法效率最高,之后是使用Java流的方法,其次是使用for循环和迭代器的方法,所以在正常情况下,还是推荐使用map的特性来进行集合中元素的对比分析和求交集的。

到此这篇关于Java求两集合中元素交集的四种方法对比总结的文章就介绍到这了,更多相关java求两集合中元素交集内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot 实现阿里云视频点播功能(删除视频)

    spring boot 实现阿里云视频点播功能(删除视频)

    这篇文章主要介绍了spring boot 实现阿里云视频点播(删除视频功能),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • idea项目的左侧目录没了如何设置

    idea项目的左侧目录没了如何设置

    这篇文章主要介绍了idea项目的左侧目录没了如何设置的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 使用Java快速将Web中表格转换成Excel的方法

    使用Java快速将Web中表格转换成Excel的方法

    在平时做系统项目时,经常会需要做导出功能,下面这篇文章主要给大家介绍了关于使用Java快速将Web中表格转换成Excel的相关资料,需要的朋友可以参考下
    2023-06-06
  • IDEA突然无法使用Git功能的问题解决

    IDEA突然无法使用Git功能的问题解决

    本文主要介绍了IDEA突然无法使用Git功能的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • Springboot 集成 SocketIO的示例代码

    Springboot 集成 SocketIO的示例代码

    Socket.IO是实现浏览器与服务器之间实时、双向和基于事件的通信的工具库,本文主要介绍了Springboot 集成 SocketIO的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • JAVA解决在@autowired,@Resource注入为null的情况

    JAVA解决在@autowired,@Resource注入为null的情况

    这篇文章主要介绍了JAVA解决在@autowired,@Resource注入为null的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java构造器(构造方法)能否可以被重写

    Java构造器(构造方法)能否可以被重写

    这篇文章主要介绍了Java构造器(构造方法)能否可以被重写问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • IDEA 通过脚本配置终端提示符样式的方法

    IDEA 通过脚本配置终端提示符样式的方法

    这篇文章给大家介绍IDEA通过脚本配置终端提示符样式的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-08-08
  • java后台实现支付宝支付接口和支付宝订单查询接口(前端为APP)

    java后台实现支付宝支付接口和支付宝订单查询接口(前端为APP)

    这篇文章主要介绍了java后台实现支付宝支付接口和支付宝订单查询接口(前端为APP),非常具有实用价值,需要的朋友可以参考下
    2018-08-08
  • SpringBoot mybatis-plus使用json字段实战指南

    SpringBoot mybatis-plus使用json字段实战指南

    在现代应用开发中经常会使用JSON格式存储和传输数据,为了便捷地处理数据库中的JSON字段,MyBatis-Plus提供了强大的JSON处理器,这篇文章主要给大家介绍了关于SpringBoot mybatis-plus使用json字段的相关资料,需要的朋友可以参考下
    2024-01-01

最新评论