欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)List去重的五種方法詳解

 更新時(shí)間:2022年10月26日 10:32:03   作者:共飲一杯無  
這篇文章主要為大家詳細(xì)介紹了Java中List去重的5種方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和參考價(jià)值,需要的小伙伴可以了解一下

在日常的業(yè)務(wù)開發(fā)中,偶爾會(huì)遇到需要將 List 集合中的重復(fù)數(shù)據(jù)去除掉的場景。這個(gè)時(shí)候可能有同學(xué)會(huì)問:為什么不直接使用 Set 或者 LinkedHashSet 呢?這樣不就沒有重復(fù)數(shù)據(jù)的問題了嘛?

不得不說,能提這個(gè)問題的同學(xué)很機(jī)智,一眼就看到了問題的本質(zhì)。

但是,在實(shí)際的業(yè)務(wù)開發(fā)中遇到的情況會(huì)更復(fù)雜。

本文為大家總結(jié)了五個(gè)常用的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的特性:元素不可重復(fù),其底層原理是先計(jì)算每個(gè)對象的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);
    }

遍歷后判斷賦給另一個(gè)list集合去重(保證順序)

   /**
     * 遍歷后判斷賦給另一個(gè)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集合實(shí)際上是利用TreeMap的帶有一個(gè)比較器參數(shù)的構(gòu)造方法實(shí)現(xiàn),看JDK源碼很清晰,最重要的是這個(gè)參數(shù)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,然后調(diào)用distinct()方法。Java8中提供流的方式對數(shù)據(jù)進(jìn)行處理,非???,底層用的是forkJoin框架,
     * 提供了并行處理,使得多個(gè)處理器同時(shí)處理流中的數(shù)據(jù),所以耗時(shí)非常短。
     */
    @Test
    public void removeRepeat5() {
        List<String> userList = getUserList();
        System.out.println("去重前:" + userList);
        List newList = userList.stream().distinct().collect(Collectors.toList());
        System.out.println("去重后:" + newList);
    }

到此這篇關(guān)于Java實(shí)現(xiàn)List去重的五種方法詳解的文章就介紹到這了,更多相關(guān)Java List去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Schedule定時(shí)任務(wù)在分布式產(chǎn)生的問題詳解

    Schedule定時(shí)任務(wù)在分布式產(chǎn)生的問題詳解

    這篇文章主要介紹了Schedule定時(shí)任務(wù)在分布式產(chǎn)生的問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Java死鎖代碼實(shí)例及產(chǎn)生死鎖必備的四個(gè)條件

    Java死鎖代碼實(shí)例及產(chǎn)生死鎖必備的四個(gè)條件

    這篇文章主要介紹了Java死鎖代碼實(shí)例及產(chǎn)生死鎖必備的四個(gè)條件,Java 發(fā)生死鎖的根本原因是,在申請鎖時(shí)發(fā)生了交叉閉環(huán)申請,synchronized在開發(fā)中最好不要嵌套使用,容易導(dǎo)致死鎖,需要的朋友可以參考下
    2024-01-01
  • 詳解Spring獲取配置的三種方式

    詳解Spring獲取配置的三種方式

    這篇文章主要為大家詳細(xì)介紹了Spring獲取配置的三種方式:@Value方式動(dòng)態(tài)獲取單個(gè)配置、@ConfigurationProperties+前綴方式批量獲取配置以及Environment動(dòng)態(tài)獲取單個(gè)配置,感興趣的可以了解一下
    2022-03-03
  • 聊聊關(guān)于Java方法重寫的反思

    聊聊關(guān)于Java方法重寫的反思

    最近在開發(fā)中遇到一個(gè)關(guān)于Java方法重寫的一些問題,對于方法重寫的用法以及可能導(dǎo)致的問題產(chǎn)生了一些思考,本文用于記錄下這些想法,希望對大家也有所幫助
    2023-05-05
  • jstl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)

    jstl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)

    下面小編就為大家?guī)硪黄猨stl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • java判斷字符串包含某個(gè)字符的實(shí)例方法

    java判斷字符串包含某個(gè)字符的實(shí)例方法

    在本篇文章里小編給大家整理的是一篇關(guān)于java判斷字符串包含某個(gè)字符的實(shí)例方法,有需要的朋友們學(xué)習(xí)下。
    2019-12-12
  • 一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

    一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要

    yBatis的底層操作封裝了JDBC的API,MyBatis的工作原理以及核心流程與JDBC的使用步驟一脈相承,MyBatis的核心對象(SqlSession,Executor)與JDBC的核心對象(Connection,Statement)相互對應(yīng)
    2021-06-06
  • java導(dǎo)出到excel常用的幾種方式總結(jié)

    java導(dǎo)出到excel常用的幾種方式總結(jié)

    導(dǎo)出excel是咱Java開發(fā)的必備技能啦,之前項(xiàng)目有這個(gè)功能,現(xiàn)在將其獨(dú)立出來,分享一下,下面這篇文章主要給大家介紹了關(guān)于java導(dǎo)出到excel常用的幾種方式,需要的朋友可以參考下
    2023-05-05
  • java語言中封裝類代碼示例

    java語言中封裝類代碼示例

    這篇文章主要介紹了java語言中封裝類,涉及相關(guān)代碼示例及結(jié)果分析,以及封裝的好處簡單介紹,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Spring Boot Event Bus用法小結(jié)

    Spring Boot Event Bus用法小結(jié)

    Spring Boot Event Bus是Spring框架中事件驅(qū)動(dòng)編程的一部分,本文主要介紹了Spring Boot Event Bus用法小結(jié),感興趣的可以了解一下
    2023-09-09

最新評論