新闻资讯

新闻资讯 媒体报道

Java中5种List的去重方法及它们的效率对比

编辑:005     时间:2020-11-16

01、使用两个for循环实现List去重(有序)

    /**使用两个for循环实现List去重(有序)
     *
     * @param list
     * */     public static List removeDuplicationBy2For(List<Integer> list) {
        for (int i=0;i<list.size();i++)
        {
            for (int j=i+1;j<list.size();j++)
            {
                if(list.get(i).equals(list.get(j))){
                    list.remove(j);
                }
            }
        }
        return list;
    }

02、使用List集合contains方法循环遍历(有序)

    /**使用List集合contains方法循环遍历(有序)
     *
     * @param list
     * */     public static List removeDuplicationByContains(List<Integer> list) {
        List<Integer> newList =new ArrayList<>();
        for (int i=0;i<list.size();i++)
        {
            boolean isContains =newList.contains(list.get(i));
            if(!isContains){
                newList.add(list.get(i));
            }
        }
        list.clear();
        list.addAll(newList);
        return list;
    }

03、使用HashSet实现List去重(无序)

    /**使用HashSet实现List去重(无序)
     *
     * @param list
     * */     public static List removeDuplicationByHashSet(List<Integer> list) {
        HashSet set = new HashSet(list);
        //把List集合所有元素清空         list.clear();
        //把HashSet对象添加至List集合         list.addAll(set);
        return list;
    }

04、使用TreeSet实现List去重(有序)

    /**使用TreeSet实现List去重(有序)
     *
     * @param list
     * */     public static List removeDuplicationByTreeSet(List<Integer> list) {
        TreeSet set = new TreeSet(list);
        //把List集合所有元素清空         list.clear();
        //把HashSet对象添加至List集合         list.addAll(set);
        return list;
    }

05、使用java8新特性stream实现List去重(有序)

    /**使用java8新特性stream实现List去重(有序)
     *
     * @param list
     * */     public static List removeDuplicationByStream(List<Integer> list) {
        List newList = list.stream().distinct().collect(Collectors.toList());
        return newList;
    }

效率测试代码

    public static void main(String args[]) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        List<Integer> list3 = new ArrayList<>();
        List<Integer> list4 = new ArrayList<>();
        List<Integer> list5 = new ArrayList<>();
        Random random =new Random();
        for (int i = 0; i < 100000; i++) {
            int value =random.nextInt(500);
            list1.add(value);
            list2.add(value);
            list3.add(value);
            list4.add(value);
            list5.add(value);
        }
        long startTime ;
        long endTime;
        startTime = System.currentTimeMillis();
        removeDuplicationByHashSet(list1);
        endTime = System.currentTimeMillis();
        System.out.println("使用HashSet实现List去重时间:"+(endTime-startTime)+"毫秒");
        startTime = System.currentTimeMillis();
        removeDuplicationByTreeSet(list2);
        endTime = System.currentTimeMillis();
        System.out.println("使用TreeSet实现List去重时间:"+(endTime-startTime)+"毫秒");
        startTime = System.currentTimeMillis();
        removeDuplicationByStream(list3);
        endTime = System.currentTimeMillis();
        System.out.println("使用java8新特性stream实现List去重:"+(endTime-startTime)+"毫秒");
        startTime = System.currentTimeMillis();
        removeDuplicationBy2For(list4);
        endTime = System.currentTimeMillis();
        System.out.println("使用两个for循环实现List去重:"+(endTime-startTime)+"毫秒");
        startTime = System.currentTimeMillis();
        removeDuplicationByContains(list5);
        endTime = System.currentTimeMillis();
        System.out.println("使用List集合contains方法循环遍历:"+(endTime-startTime)+"毫秒");     }

结果:

  • 使用HashSet实现List去重时间:40毫秒
  • 使用TreeSet实现List去重时间:36毫秒
  • 使用java8新特性stream实现List去重:78毫秒
  • 使用两个for循环实现List去重:533毫秒
  • 使用List集合contains方法循环遍历:40毫秒

更多测试结果

随机数在100范围内:

  • 使用HashSet实现List去重时间:32毫秒
  • 使用TreeSet实现List去重时间:40毫秒
  • 使用java8新特性stream实现List去重:128毫秒
  • 使用两个for循环实现List去重:693毫秒
  • 使用List集合contains方法循环遍历:30毫秒

随机数在1000范围内:

  • 使用HashSet实现List去重时间:34毫秒
  • 使用TreeSet实现List去重时间:72毫秒
  • 使用java8新特性stream实现List去重:125毫秒
  • 使用两个for循环实现List去重:1063毫秒
  • 使用List集合contains方法循环遍历:85毫秒

随机数在10000范围内:

  • 使用HashSet实现List去重时间:51毫秒
  • 使用TreeSet实现List去重时间:103毫秒
  • 使用java8新特性stream实现List去重:201毫秒
  • 使用两个for循环实现List去重:5448毫秒
  • 使用List集合contains方法循环遍历:791毫秒

结论

无序HashSet,有序TreeSet

本内容属于网络转载,文中涉及图片等内容如有侵权,请联系编辑删除

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐