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

Java集合List快速實(shí)現(xiàn)重復(fù)判斷的10種方案

 更新時間:2025年12月26日 08:50:16   作者:.貓的樹  
在Java開發(fā)中,List集合的重復(fù)判斷是高頻操作場景,不當(dāng)?shù)膶?shí)現(xiàn)方式可能導(dǎo)致O(n2)時間復(fù)雜度,在百萬級數(shù)據(jù)時產(chǎn)生分鐘級延遲,本文通過10種實(shí)現(xiàn)方案對比,揭示不同場景下的最優(yōu)選擇,需要的朋友可以參考下

引言:為什么需要關(guān)注List重復(fù)判斷?

在Java開發(fā)中,List集合的重復(fù)判斷是高頻操作場景。不當(dāng)?shù)膶?shí)現(xiàn)方式可能導(dǎo)致O(n²)時間復(fù)雜度,在百萬級數(shù)據(jù)時產(chǎn)生分鐘級延遲。本文通過10種實(shí)現(xiàn)方案對比,揭示不同場景下的最優(yōu)選擇。

一、基礎(chǔ)實(shí)現(xiàn)方法

1.1 暴力雙循環(huán)法

public static boolean hasDuplicate(List<?> 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))) {
                return true;
            }
        }
    }
    return false;
}

復(fù)雜度分析:

  • 時間復(fù)雜度:O(n²)
  • 空間復(fù)雜度:O(1)

1.2 HashSet法

public static boolean hasDuplicateByHashSet(List<?> list) {
    Set<Object> set = new HashSet<>(list.size());
    for (Object item : list) {
        if (!set.add(item)) { // add返回false表示存在重復(fù)
            return true;
        }
    }
    return false;
}

優(yōu)化點(diǎn):

  • 初始容量設(shè)置為list.size()避免擴(kuò)容
  • 快速失敗機(jī)制

二、進(jìn)階實(shí)現(xiàn)方案

2.1 Stream API實(shí)現(xiàn)

public static boolean hasDuplicateByStream(List<?> list) {
    return list.stream().distinct().count() < list.size();
}

特性:

  • 代碼簡潔
  • 支持并行處理

2.2 TreeSet排序法

public static boolean hasDuplicateByTreeSet(List<?> list) {
    Set<Object> set = new TreeSet<>(list);
    return set.size() < list.size();
}

適用場景:

  • 需要自然排序結(jié)果
  • 元素實(shí)現(xiàn)Comparable接口

三、高性能優(yōu)化方案

3.1 并行流處理

public static boolean hasDuplicateParallel(List<?> list) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return list.parallelStream().anyMatch(e -> !seen.add(e));
}

優(yōu)勢:

  • 利用多核CPU加速
  • 線程安全的并發(fā)集合

3.2 BitSet位圖法(僅限整數(shù))

public static boolean hasDuplicateByBitSet(List<Integer> list) {
    BitSet bitSet = new BitSet();
    for (Integer num : list) {
        if (bitSet.get(num)) return true;
        bitSet.set(num);
    }
    return false;
}

限制:

  • 僅適用于正整數(shù)
  • 內(nèi)存占用與最大數(shù)值相關(guān)

四、第三方庫實(shí)現(xiàn)

4.1 Guava工具類

import com.google.common.collect.Sets;

public static boolean hasDuplicateByGuava(List<?> list) {
    return Sets.newHashSet(list).size() < list.size();
}

4.2 Apache Commons

import org.apache.commons.collections4.CollectionUtils;

public static boolean hasDuplicateByCommons(List<?> list) {
    return CollectionUtils.getCardinalityMap(list).values()
           .stream().anyMatch(count -> count > 1);
}

五、性能測試對比

5.1 測試環(huán)境配置

硬件規(guī)格
CPUIntel i7-12700H
內(nèi)存32GB DDR5
JDKOracle JDK 17.0.2

5.2 百萬級數(shù)據(jù)測試結(jié)果

方法10萬元素(ms)100萬元素(ms)線程安全
暴力雙循環(huán)12,345超時(>5min)
HashSet18210
Stream25320
并行流1595
BitSet845

六、最佳實(shí)踐指南

6.1 選擇依據(jù)矩陣

6.2 避坑指南

  1. 對象必須正確重寫equals/hashCode
class User {
    private Long id;
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof User user)) return false;
        return Objects.equals(id, user.id);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
  1. 并發(fā)場景使用線程安全容器
Set<Object> safeSet = Collections.synchronizedSet(new HashSet<>());
  1. 避免在Stream中使用有狀態(tài)操作
// 錯誤示例:并行流中可能導(dǎo)致漏判
list.parallelStream().forEach(e -> {
    if (set.contains(e)) flag = true;
    set.add(e);
});

七、特殊場景處理

7.1 自定義對象多字段判重

public static boolean hasDuplicateByMultiField(List<User> users) {
    Set<String> seen = new HashSet<>();
    return users.stream()
        .map(u -> u.getName() + "|" + u.getEmail())
        .anyMatch(key -> !seen.add(key));
}

7.2 大數(shù)據(jù)量分塊處理

public static boolean hasDuplicateInChunks(List<?> list, int chunkSize) {
    for (int i = 0; i < list.size(); i += chunkSize) {
        List<?> subList = list.subList(i, Math.min(i + chunkSize, list.size()));
        if (hasDuplicateByHashSet(subList)) {
            return true;
        }
    }
    return false;
}

結(jié)語:高效去重的本質(zhì)

選擇最優(yōu)重復(fù)判斷方法的核心在于理解數(shù)據(jù)結(jié)構(gòu)特性業(yè)務(wù)場景需求的匹配。通過本文的測試數(shù)據(jù)可知,合理選擇算法可以將百萬級數(shù)據(jù)的判斷時間從分鐘級壓縮到毫秒級。

以上就是Java集合List快速實(shí)現(xiàn)重復(fù)判斷的10種方案的詳細(xì)內(nèi)容,更多關(guān)于Java List實(shí)現(xiàn)重復(fù)判斷的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java多線程編程必備volatile與synchronized深入理解

    java多線程編程必備volatile與synchronized深入理解

    這篇文章主要介紹了java多線程編程必備volatile與synchronized的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java Thread中start()和run()的區(qū)別_動力節(jié)點(diǎn)Java學(xué)院整理

    Java Thread中start()和run()的區(qū)別_動力節(jié)點(diǎn)Java學(xué)院整理

    start() : 它的作用是啟動一個新線程,新線程會執(zhí)行相應(yīng)的run()方法。start()不能被重復(fù)調(diào)用。而run() : run()就和普通的成員方法一樣,可以被重復(fù)調(diào)用。下面通過示例代碼給大家介紹了Java Thread中start()和run()的區(qū)別,感興趣的朋友一起看看吧
    2017-05-05
  • Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之背包問題

    Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之背包問題

    背包問題是一個非常典型的考察動態(tài)規(guī)劃應(yīng)用的題目,對其加上不同的限制和條件,可以衍生出諸多變種,若要全面理解動態(tài)規(guī)劃,就必須對背包問題了如指掌
    2022-02-02
  • 一文搞懂Spring中@Autowired和@Resource的區(qū)別

    一文搞懂Spring中@Autowired和@Resource的區(qū)別

    @Autowired?和?@Resource?都是?Spring/Spring?Boot?項(xiàng)目中,用來進(jìn)行依賴注入的注解。它們都提供了將依賴對象注入到當(dāng)前對象的功能,但二者卻有眾多不同,并且這也是常見的面試題之一,所以我們今天就來盤它
    2022-08-08
  • MybatisPlus的LambdaQueryWrapper用法詳解

    MybatisPlus的LambdaQueryWrapper用法詳解

    LambdaQueryWrapper<Tag>?是 MyBatis-Plus 框架中的一個功能強(qiáng)大的查詢構(gòu)造器,它用于構(gòu)建 SQL 查詢條件,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10
  • Java垃圾回收之標(biāo)記清除算法詳解

    Java垃圾回收之標(biāo)記清除算法詳解

    今天小編就為大家分享一篇關(guān)于Java垃圾回收之標(biāo)記清除算法詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java在排序數(shù)組中查找元素的第一個和最后一個位置的方法詳解

    Java在排序數(shù)組中查找元素的第一個和最后一個位置的方法詳解

    相信大家在操作Java的時候經(jīng)常會要在一個數(shù)組(無序)中查找元素的第一個和最后一個位置,下面這篇文章主要給大家介紹了關(guān)于Java在排序數(shù)組中查找元素的第一個和最后一個位置的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Scala數(shù)據(jù)庫連接池的簡單實(shí)現(xiàn)

    Scala數(shù)據(jù)庫連接池的簡單實(shí)現(xiàn)

    本文主要介紹了Scala數(shù)據(jù)庫連接池的簡單實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 詳解Spring如何整合Mybatis

    詳解Spring如何整合Mybatis

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Spring如何整合Mybatis展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java中Playwright 應(yīng)用入門從基礎(chǔ)到實(shí)踐

    Java中Playwright 應(yīng)用入門從基礎(chǔ)到實(shí)踐

    Playwright是微軟開發(fā)的開源自動化工具,專注于現(xiàn)代Web應(yīng)用的端到端測試、網(wǎng)頁爬取和瀏覽器自動化,本文給大家介紹Java中Playwright 應(yīng)用入門從基礎(chǔ)到實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2025-09-09

最新評論

连平县| 肇东市| 六盘水市| 湘潭县| 彭水| 泉州市| 安丘市| 镇坪县| 邛崃市| 郸城县| 梧州市| 团风县| 贵州省| 三亚市| 车险| 洛宁县| 分宜县| 健康| 高阳县| 堆龙德庆县| 长顺县| 潜山县| 临沭县| 天台县| 镇坪县| 闽清县| 夏河县| 错那县| 太原市| 宜春市| 曲水县| 鹤岗市| 桂东县| 福州市| 安乡县| 同德县| 阿克| 陈巴尔虎旗| 无极县| 泗水县| 和平县|