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



     

    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.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @Context
    hutool.poi使用,hutool导入
    Switch Off Offline Mode
    大数据-linux之大数据-shell变量
    大数据-linux之大数据-shell编程
    大数据-linux之java环境搭建-mysql的安装
    大数据-linux之java环境搭建-eclipse的下载安装
    大数据-linux之javaee环境搭建-tomcat的安装
    大数据-linux搭建javaee的开发环境-jdk的安装
    大数据-linux实操篇-RPM包管理
  • 原文地址:https://www.cnblogs.com/bainannan/p/13971546.html
Copyright © 2020-2023  润新知