最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中List數(shù)據(jù)去重的3種有效方法總結(jié)

 更新時間:2026年02月26日 10:10:59   作者:_Lemon7  
在Java編程中,List集合是一種常用的數(shù)據(jù)結(jié)構(gòu),它允許我們存儲和操作一組有序的對象,這篇文章主要介紹了Java中List數(shù)據(jù)去重的3種有效方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在日常 Java 開發(fā)中,List 集合去重是一個非常常見的需求。根據(jù) 是否需要保持順序、數(shù)據(jù)規(guī)模大小、JDK 版本 的不同,去重方式也有所區(qū)別。

本文總結(jié)了 5 種常見且實用的 List 去重方法,并對每種方法的使用場景、優(yōu)缺點進(jìn)行了說明,供大家在實際項目中選擇合適的方案。

一、使用 Java 8 Stream 的distinct()方法(推薦)

適用場景

  • JDK 8 及以上

  • 追求代碼簡潔、可讀性強(qiáng)

示例代碼

public static List<String> delRepeat(List<String> list) {
    return list.stream()
               .distinct()
               .collect(Collectors.toList());
}

原理說明

  • distinct() 底層依賴對象的 equals()hashCode() 方法

  • 會自動過濾掉重復(fù)元素

  • 保留原 List 中的順序

優(yōu)缺點

優(yōu)點:

  • 代碼簡潔、優(yōu)雅

  • 可讀性強(qiáng)

  • 保留原順序

缺點:

  • 僅適用于 JDK 8 及以上

二、借助 Set 的特性進(jìn)行去重(List 與 Set 轉(zhuǎn)換)

適用場景

  • 不關(guān)心元素順序

  • 對性能有一定要求

示例代碼

/**
 * 去除重復(fù)數(shù)據(jù)
 * 注意:Set 是無序的,不會保持原有順序
 */
public static List<String> listDistinct(List<String> list) {
    List<String> result = new ArrayList<>();
    if (list != null && !list.isEmpty()) {
        Set<String> set = new HashSet<>(list);
        result.addAll(set);
    }
    return result;
}

原理說明

  • HashSet 天生不允許重復(fù)元素

  • 通過 Set 進(jìn)行一次“過濾”

優(yōu)缺點

優(yōu)點:

  • 性能較好

  • 實現(xiàn)簡單

缺點:

  • 無法保證原 List 的順序

三、遍歷 List,將元素添加到另一個 List 中(保持順序)

適用場景

  • 數(shù)據(jù)量較小

  • 需要嚴(yán)格保持原有順序

示例代碼

public static List<String> delRepeat(List<String> list) {
    List<String> listNew = new ArrayList<>();
    for (String str : list) {
        if (!listNew.contains(str)) {
            listNew.add(str);
        }
    }
    return listNew;
}

原理說明

  • 利用 List.contains() 判斷是否已存在

  • 不存在則加入新 List

優(yōu)缺點

優(yōu)點:

  • 思路直觀

  • 順序完全一致

缺點:

  • 時間復(fù)雜度較高(O(n²))

  • 不適合大數(shù)據(jù)量

四、利用 Set 去重并保持原有順序(強(qiáng)烈推薦)

如果既想去重,又想保持順序,這是非常實用的一種方式。

方法一:使用TreeSet(會排序)

List<String> listNew = new ArrayList<>(new TreeSet<>(list));

注意:

  • TreeSet 會自動排序

  • 如果不希望順序被改變,請慎用

方法二:使用LinkedHashSet(推薦)

List<String> listNew = new ArrayList<>(new LinkedHashSet<>(list));

原理說明

  • LinkedHashSet 內(nèi)部維護(hù)了插入順序

  • 去重的同時保持 List 原有順序

優(yōu)缺點

優(yōu)點:

  • 性能好

  • 順序穩(wěn)定

  • 代碼簡潔

缺點:

  • 需要額外的 Set 容器

實際開發(fā)中非常推薦這一種方式

五、使用 List 的remove()方法去重(不推薦 )

適用場景

  • 幾乎不推薦,僅用于理解原理

示例代碼

/**
 * 去除重復(fù)數(shù)據(jù)(一般不推薦)
 * 類似于冒泡排序思想
 */
public static List<Map<String, Object>> distinct(List<Map<String, Object>> list) {
    if (list != null && list.size() > 0) {
        for (int i = 0; i < list.size() - 1; i++) {
            for (int j = list.size() - 1; j > i; j--) {
                // 根據(jù)實際業(yè)務(wù)修改比較規(guī)則
                if (list.get(j).equals(list.get(i))) {
                    list.remove(j);
                }
            }
        }
    }
    return list;
}

缺點

  • 時間復(fù)雜度高(O(n²))
  • 直接修改原 List,風(fēng)險較大
  • 可讀性和維護(hù)性較差

總結(jié)對比

方法是否推薦是否保持順序適用場景
Stream distinct?????JDK 8+,代碼簡潔
HashSet 轉(zhuǎn)換???不關(guān)心順序
遍歷 List??小數(shù)據(jù)量
LinkedHashSet?????最常用、最穩(wěn)妥
remove() 去重?不推薦

到此這篇關(guān)于Java中List數(shù)據(jù)去重的3種有效方法的文章就介紹到這了,更多相關(guān)Java List數(shù)據(jù)去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA?JNA調(diào)用C接口的三種實現(xiàn)方式

    JAVA?JNA調(diào)用C接口的三種實現(xiàn)方式

    文章主要介紹了使用JNA(Java?Native?Access)調(diào)用C庫的方法,包括繼承Library接口、直接使用`NativeLibrary`實例和使用頭文件實現(xiàn)接口等方式,并詳細(xì)描述了在Linux環(huán)境下使用JNA調(diào)用C庫的具體操作步驟,還涉及到了一些遇到的問題的解決方法
    2026-05-05
  • Java實現(xiàn)讀取Jar文件屬性的方法詳解

    Java實現(xiàn)讀取Jar文件屬性的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實現(xiàn)讀取Jar文件屬性的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • SpringBoot中@Conditional注解的介紹及實踐

    SpringBoot中@Conditional注解的介紹及實踐

    在 Spring Boot 中,@Conditional 注解用于實現(xiàn) 條件化 Bean 裝配,本文將詳細(xì)介紹 @Conditional 相關(guān)的注解,并結(jié)合實際應(yīng)用示例講解其使用方式,感興趣的小伙伴可以了解下
    2025-03-03
  • 帶你入門Java的方法

    帶你入門Java的方法

    這篇文章主要介紹了java基礎(chǔ)之方法詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-07-07
  • Springboot如何統(tǒng)一處理Filter異常

    Springboot如何統(tǒng)一處理Filter異常

    這篇文章主要介紹了Springboot如何統(tǒng)一處理Filter異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java中JDBC的使用教程詳解

    Java中JDBC的使用教程詳解

    Java語言操作數(shù)據(jù)庫?JDBC本質(zhì):其實是官方(sun公司)定義的一套操作所有關(guān)系型數(shù)據(jù)庫的規(guī)則,即接口。本文講解了JDBC的使用方法,需要的可以參考一下
    2022-06-06
  • Flink JobGraph生成源碼解析

    Flink JobGraph生成源碼解析

    這篇文章主要為大家介紹了Flink JobGraph生成源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java輸入輸出語句舉例詳解(通俗易懂!)

    Java輸入輸出語句舉例詳解(通俗易懂!)

    這篇文章主要給大家介紹了關(guān)于Java輸入輸出語句的相關(guān)資料,作為一種常用的編程語言,Java提供了多種輸入輸出的方式,用于與用戶進(jìn)行數(shù)據(jù)交互或處理文件數(shù)據(jù),需要的朋友可以參考下
    2023-10-10
  • java 中Thread.join()的使用方法

    java 中Thread.join()的使用方法

    這篇文章主要介紹了java 中Thread.join()的使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • SpringBoot項目中使用騰訊云發(fā)送短信的實現(xiàn)

    SpringBoot項目中使用騰訊云發(fā)送短信的實現(xiàn)

    本文主要介紹了SpringBoot項目中使用騰訊云發(fā)送短信的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論

郯城县| 贵溪市| 蓝山县| 静安区| 竹北市| 临泽县| 通许县| 壶关县| 吉木萨尔县| 长寿区| 治多县| 福清市| 蓝田县| 顺平县| 民权县| 光山县| 五大连池市| 监利县| 独山县| 阳高县| 东阳市| 中阳县| 邹城市| 博兴县| 绿春县| 石河子市| 南安市| 恩施市| 大英县| 伊吾县| 南木林县| 泽普县| 乃东县| 永川市| 宝坻区| 师宗县| 阳谷县| 西充县| 普兰店市| 余庆县| 抚顺县|