Java实现List去重的五种方法详解

 更新时间:2022年10月26日 10:32:03   作者:共饮一杯无  
这篇文章主要为大家详细介绍了Java中List去重的5种方法,文中的示例代码讲解详细,具有一定的学习和参考价值,需要的小伙伴可以了解一下

在日常的业务开发中,偶尔会遇到需要将 List 集合中的重复数据去除掉的场景。这个时候可能有同学会问:为什么不直接使用 Set 或者 LinkedHashSet 呢?这样不就没有重复数据的问题了嘛?

不得不说,能提这个问题的同学很机智,一眼就看到了问题的本质。

但是,在实际的业务开发中遇到的情况会更复杂。

本文为大家总结了五个常用的List去重方式,希望有所帮助

通过HashSet去重(不保证顺序)

    
    public static List<String> getUserList() {
        List<String> userList = new ArrayList<>();
        userList.add("小王");
        userList.add("小张");
        userList.add("小詹");
        userList.add("小王");
        userList.add("老王");
        userList.add("小詹");
        return userList;
    }

    /**
     * 通过HashSet去重(不保证顺序)
     * 利用了Set的特性:元素不可重复,其底层原理是先计算每个对象的hash值,再比较元素值是否相同,如果相同,则保留最新的。
     */
    @Test
    public void removeRepeat1() {
        List<String> userList = getUserList();
        System.out.println("去重前:" + userList);
        Set<String> hashSet = new HashSet<>(userList);
        List newList = new ArrayList(hashSet);
        System.out.println("去重后:" + newList);
    }

通过HashSet去重(保证顺序)

   /**
     * 通过HashSet去重(保证顺序)
     */
    @Test
    public void removeRepeat2() {
        List<String> userList = getUserList();
        System.out.println("去重前:" + userList);
        Set set = new HashSet();
        List newList = new ArrayList();
        for (String str : userList) {
            if (set.add(str)) {
                newList.add(str);
            }
        }
        System.out.println("去重后:" + newList);
    }

遍历后判断赋给另一个list集合去重(保证顺序)

   /**
     * 遍历后判断赋给另一个list集合去重(保证顺序)
     */
    @Test
    public void removeRepeat3() {
        List<String> userList = getUserList();
        System.out.println("去重前:" + userList);
        List<String> newList = new ArrayList<String>();
        for (String str : userList) {
            if (!newList.contains(str)) {
                newList.add(str);
            }
        }
        System.out.println("去重后:" + newList);
    }

通过TreeSet去重(保证顺序)

    /**
     * 通过TreeSet去重(保证顺序)
     * TreeSet集合实际上是利用TreeMap的带有一个比较器参数的构造方法实现,看JDK源码很清晰,最重要的是这个参数Comparator接口
     */
    @Test
    public void removeRepeat4() {
        List<String> userList = getUserList();
        System.out.println("去重前:" + userList);
        Set<String> treeSet = new TreeSet<>();
        treeSet.addAll(userList);
        List newList = new ArrayList(treeSet);
        System.out.println("去重后:" + newList);
    }

Java8中Stream流处理(保证顺序)

    /**
     * Java8中Stream流处理(保证顺序)
     * 首先获得此list的Stream,然后调用distinct()方法。Java8中提供流的方式对数据进行处理,非常快,底层用的是forkJoin框架,
     * 提供了并行处理,使得多个处理器同时处理流中的数据,所以耗时非常短。
     */
    @Test
    public void removeRepeat5() {
        List<String> userList = getUserList();
        System.out.println("去重前:" + userList);
        List newList = userList.stream().distinct().collect(Collectors.toList());
        System.out.println("去重后:" + newList);
    }

到此这篇关于Java实现List去重的五种方法详解的文章就介绍到这了,更多相关Java List去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java接口异步调用

    Java接口异步调用

    这篇文章主要介绍了Java接口异步调用,下面我们来一起学习一下吧
    2019-05-05
  • Java 反射机制

    Java 反射机制

    这篇文章简要的说明了Java的反射机制,Java的反射是框架设计的灵魂,本文通过例子能看的更加清晰的理解
    2021-06-06
  • Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性

    Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性

    今天小编就为大家分享一篇关于Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • SpringMVC 中文乱码的解决方案

    SpringMVC 中文乱码的解决方案

    这篇文章主要介绍了SpringMVC 中文乱码的解决方案,帮助大家更好的理解和学习使用SpringMVC,感兴趣的朋友可以了解下
    2021-04-04
  • Java高级架构之FastDFS分布式文件集群详解

    Java高级架构之FastDFS分布式文件集群详解

    这篇文章主要介绍了Java高级架构之FastDFS分布式文件集群详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • 详解Spring ApplicationContext加载过程

    详解Spring ApplicationContext加载过程

    这篇文章主要介绍了Spring ApplicationContext加载过程的相关资料,帮助大家更好的理解和学习使用spring框架,感兴趣的朋友可以了解下
    2021-03-03
  • Spring Cloud与分布式系统简析

    Spring Cloud与分布式系统简析

    这篇文章主要介绍了Spring Cloud与分布式系统的相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • springboot国际化多语言配置方式

    springboot国际化多语言配置方式

    这篇文章主要介绍了springboot国际化多语言配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java之如何正确地对包装类进行装箱与拆箱

    Java之如何正确地对包装类进行装箱与拆箱

    在这篇文章中给大家继续讲解包装类的装箱和拆箱问题。你可能会很好奇,做java开发,怎么还装起箱子来了?那么就请大家带着疑惑往下看吧
    2023-04-04
  • Java中Static关键字的五种用法详解

    Java中Static关键字的五种用法详解

    这篇文章主要介绍了Java中static的五种用法:修饰成员变量,修饰成员方法,修饰内部类,静态代码块,静态导包,想详细了解的小伙伴可以参考阅读本文
    2023-03-03

最新评论