Java中5种List的去重方法及它们的效率对比,你用对了吗?

JAVA葵花宝典

共 326字,需浏览 1分钟

 ·

2020-11-19 02:26

来源:blog.csdn.net/qq3434569/article/details/100520524

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

    /**使用两个for循环实现List去重(有序)
     *
     * @param list
     * */

    public static List removeDuplicationBy2For(List list) {
        for (int i=0;i        {
            for (int j=i+1;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 list) {
        List newList =new ArrayList<>();
        for (int i=0;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 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 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 list) {
        List newList = list.stream().distinct().collect(Collectors.toList());
        return newList;
    }

效率测试代码

    public static void main(String args[]) {
        List list1 = new ArrayList<>();
        List list2 = new ArrayList<>();
        List list3 = new ArrayList<>();
        List list4 = new ArrayList<>();
        List 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

推荐阅读

这应该是全网最全的Git分支开发规范手册~

图片验证码的需求分析、优雅实现

8种常见SQL错误用法

一个小小的签到功能,到底用MySQL还是Redis?


最后,推荐给大家一个有趣有料的公众号:写代码的渣渣鹏,7年老程序员教你写bug,回复 面试或资源 送一你整套开发笔记 有惊喜哦


浏览 26
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报