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

Java 的知识面非常广,面试问的涉及也非常广泛,重点包括:Java 基础、Java 并发,JVM、MySQL、数据结构、算法、Spring、微服务、MQ 等等,涉及的知识点何其庞大,所以我们在复习的时候也往往无从下手,今天小编给大家带来一套 Java 面试题,题库非常全面,包括 Java 基础、Java 集合、JVM、Java 并发、Spring全家桶、Redis、MySQL、Dubbo、Netty、MQ 等等,包含 Java 后端知识点 2000 +

资料获取方式:关注公众号:“程序员白楠楠”获取上述资料

Java中5种List的去重方法及它们的效率对比,你用对了吗?的更多相关文章

  1. Java中8种常见的排序方法

    排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...

  2. Java中四种遍历List的方法

    package com.ietree.basic.collection.loop; import java.util.ArrayList; import java.util.Iterator; imp ...

  3. JAVA 中两种判断输入的是否是数字的方法__正则化_

    JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

  4. Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

  5. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

  6. java中获取日期和时间的方法总结

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...

  7. jsp中四种传递参数的方法

    jsp中四种传递参数的方法如下: 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="i ...

  8. java中四种引用类型

    java中四种引用类型  今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在 ...

  9. java中遍历map对象的多种方法

    在Java中如何遍历Map对象   How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...

随机推荐

  1. 【不知道怎么分类】HDU - 5963 朋友

    题目内容 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始 ...

  2. 调试与优化:一次数据中心看板 T+1 改 T+0 优化过程

    背景 团队目前在做一个用户数据看板(下面简称看板),基本覆盖用户的所有行为数据,并生成分析数据,用户行为数据来源于多个数据源(餐饮.生活日用.充值消费.交通出行.通讯物流.交通出行.医疗保健.住房物业 ...

  3. HTML语义化罗嗦罗嗦

    CSS还未诞生之前,为了实现一些样式效果.设计师必须使用一些物理标签,例如font.b等.这样会造成页面中充满了为实现各种样式的标签,特别是使用table标签来实现一些特殊的布局,俗称为"标 ...

  4. 4.QOpenGLWidget-对三角形进行纹理贴图、纹理叠加

    在上章3.QOpenGLWidget-通过着色器来渲染渐变三角形,我们为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像.但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多 ...

  5. LruCache缓存bitmap(二)

    Lrucache缓存程序关闭缓存自动清除,所以要在onstart方法中调用,只要不关闭程序缓存就在,除以1024是以kb为单位 public class MainActivity extends Ap ...

  6. Hive源码解析

    date: 2020-07-08 15:12:00 updated: 2020-08-21 17:38:00 Hive源码解析 入口:hive-cli-1.1.0-cdh5.14.4.jar!/org ...

  7. 支持向量机SVM基本问题

    1.SVM的原理是什么? SVM是一种二类分类模型.它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器.(间隔最大是它有别于感知机) 试图寻找一个超平面来对样本分割,把样本中的正例和反例 ...

  8. Linux exec族函数解析

    背景 在提到 vfork 函数时,我们提到了这个概念.为了更好地学习与运用,我们对exec族函数进行展开. exec函数族 介绍 有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中 ...

  9. 写时复制集合 —— CopyOnWriteArrayList

    前言 JUC 下面还有一个系列的类,都是 CopyOnWriteXXX ,意思是写时复制,这个究竟是怎么回事?那就以 CopyOnWriteArrayList 为切入点,一起了解写时复制是怎么回事? ...

  10. 学了Java才搞懂JMeter测试计划

    本文的内容是对这个界面的东西进行讲解: Name 名字,测试计划总得有个名字. Comments 注释,除了名字,还得让人知道它是干嘛的. User Defined Variables 测试计划是根节 ...