美文网首页
高效率的集合交集(差集)处理方式

高效率的集合交集(差集)处理方式

作者: KingdomCoder | 来源:发表于2020-05-07 10:54 被阅读0次

    我们在业务上难免会遇到集合交集的处理,这边总结了几种方式比较,然后寻求最优的方式。当然如果集合数据比较少的情况下,选取的方式基本都能满足需求,但是如果在数据量比较大的情况下呢?如果选取的方式不好,那么效率就会及其的低下。下面我们就集中方式展开分析。

    ArrayList原生接口retainAll(c)方式

        public static void main(String[] args) {
            
            List<String> list1 = new ArrayList<String>();
            List<String> list2 = new ArrayList<String>();
            List<String> r = new ArrayList<>();
            // 初始化数据
            for (int i = 0; i < 30000; i++) {
                list1.add("test" + i);
                list2.add("test" + i * 3);
            }
            System.out.println("添加完成");
            long t = System.currentTimeMillis();
            list1.retainAll(list2);
            System.out.println(System.currentTimeMillis() - t);
        }
    

    我们执行上述代码,我们一个集合3w的数据,耗时时间基本都是在9s左右。

    通过list遍历contains判定方式

      public static void main(String[] args) {
    
    
            List<String> list1 = new ArrayList<String>();
            List<String> list2 = new ArrayList<String>();
            List<String> r = new ArrayList<>();
            for (int i = 0; i < 30000; i++) {
                list1.add("test" + i);
                list2.add("test" + i * 3);
            }
            System.out.println("添加完成");
            long t = System.currentTimeMillis();
    
            list1.stream().forEach(s->{
                if(list2.contains(s)){
                    r.add(s);
                }
            });
    
            System.out.println(System.currentTimeMillis() - t);
    
        }
    

    跟原生api的方式比较,效率差不多,通过代码分析,原生api也是采用的是集合遍历然后contains判定的。

    List转Map通过key来判定是否交叉

    public static void main(String[] args) {
    
    
            List<String> list1 = new ArrayList<String>();
            List<String> list2 = new ArrayList<String>();
            List<String> r = new ArrayList<>();
            for (int i = 0; i < 30000; i++) {
                list1.add("test" + i);
                list2.add("test" + i * 3);
            }
            System.out.println("添加完成");
            long t = System.currentTimeMillis();
    
    
            Map<String, String> map1 = list1.stream().collect(toMap(s -> s, Function.<String>identity()));
            list2.stream().forEach(s -> {
                String ss = map1.get(s);
                if (ss != null) {
                    r.add(ss);
                }
            });
    
            System.out.println(System.currentTimeMillis() - t);
        }
    

    执行代码跟上面两种方式相比,效率是相当的高,两个数组都在3W级别的数量集,基本保持在100ms左右即可完成。

    相关文章

      网友评论

          本文标题:高效率的集合交集(差集)处理方式

          本文链接:https://www.haomeiwen.com/subject/cfpoghtx.html