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

Java集合框架實戰(zhàn)HashMap與HashSet的使用案例

 更新時間:2025年11月18日 14:47:52   作者:?959  
本文通過兩個案例詳細介紹了HashMap和HashSet在Java中的應用,通過這些案例,我們學習了如何選擇合適的集合類型、重寫equals和hashCode方法、利用泛型和并發(fā)集合等最佳實踐,感興趣的朋友跟隨小編一起看看吧

在Java編程中,集合框架是我們處理數(shù)據(jù)的利器。今天我們將通過兩個實用的案例——單詞統(tǒng)計器和數(shù)據(jù)去重排序器,來深入探索HashMap和HashSet的強大功能。

案例一:單詞統(tǒng)計器 - HashMap的完美應用

項目概述

單詞統(tǒng)計器是一個能夠分析文本中單詞出現(xiàn)頻率的工具,在自然語言處理、文本分析和數(shù)據(jù)挖掘等領域有著廣泛的應用。通過這個案例,我們將學習如何使用HashMap來高效地統(tǒng)計和管理鍵值對數(shù)據(jù)。

核心實現(xiàn)原理

public class WordCounter {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入一段文本:");
        String text = scanner.nextLine();
        // 使用HashMap統(tǒng)計單詞出現(xiàn)次數(shù)
        HashMap<String, Integer> wordCount = new HashMap<>();
        // 分割文本為單詞(按空格和標點符號分割)
        String[] words = text.split("[\\s\\p{Punct}]+");
        for (String word : words) {
            if (!word.isEmpty()) {
                String lowerWord = word.toLowerCase(); // 不區(qū)分大小寫
                wordCount.put(lowerWord, wordCount.getOrDefault(lowerWord, 0) + 1);
            }
        }
        // 輸出統(tǒng)計結(jié)果
        System.out.println("\n單詞統(tǒng)計結(jié)果:");
        for (Map.Entry<String, Integer> entry : wordCount.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

技術(shù)深度解析

1. 文本分割策略

String[] words = text.split("[\\s\\p{Punct}]+");

正則表達式詳解:

  • \\s:匹配任何空白字符(空格、制表符、換行符等)
  • \\p{Punct}:匹配任何標點符號
  • +:表示一個或多個前述字符

這種分割方式能夠處理各種復雜的文本情況,比如:

  • "hello,world!" → ["hello", "world"]
  • "data;analysis:important" → ["data", "analysis", "important"]

2. HashMap的智能更新

wordCount.put(lowerWord, wordCount.getOrDefault(lowerWord, 0) + 1);

getOrDefault()方法的優(yōu)勢:

  • 避免繁瑣的null檢查
  • 代碼更加簡潔優(yōu)雅
  • 提高代碼可讀性

傳統(tǒng)方式對比:

// 傳統(tǒng)方式
if (wordCount.containsKey(lowerWord)) {
    wordCount.put(lowerWord, wordCount.get(lowerWord) + 1);
} else {
    wordCount.put(lowerWord, 1);
}
// 現(xiàn)代方式(推薦)
wordCount.put(lowerWord, wordCount.getOrDefault(lowerWord, 0) + 1);

3. 大小寫處理

通過toLowerCase()方法實現(xiàn)大小寫不敏感的統(tǒng)計,確保"Hello"和"hello"被識別為同一個單詞。

運行示例

請輸入一段文本:

Hello world! Hello Java. Java is great, world is beautiful.

單詞統(tǒng)計結(jié)果:

hello: 2

world: 2

java: 2

is: 2

great: 1

beautiful: 1

性能優(yōu)化建議

1.初始容量設置:如果知道大致單詞數(shù)量,可以設置初始容量提高性能

HashMap<String, Integer> wordCount = new HashMap<>(expectedSize);

2.并行處理:對于大文本,可以使用并行流加速處理

Arrays.stream(words)
      .parallel()
      .forEach(word -> {
          // 統(tǒng)計邏輯
      });

案例二:數(shù)據(jù)去重與排序 - HashSet與TreeSet的協(xié)同作戰(zhàn)

項目概述

數(shù)據(jù)去重和排序是數(shù)據(jù)處理中的常見需求。這個案例展示了如何使用HashSet快速去重,并結(jié)合TreeSet或Collections.sort()實現(xiàn)排序功能。

完整實現(xiàn)代碼

public class DeduplicationAndSorting {
    public static void main(String[] args) {
        // 創(chuàng)建包含重復元素的整數(shù)列表
        ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(
            5, 2, 8, 2, 1, 9, 5, 3, 7, 1, 4, 6, 8, 3
        ));
        System.out.println("原始列表: " + numbers);
        // 使用HashSet去重
        HashSet<Integer> uniqueNumbers = new HashSet<>(numbers);
        System.out.println("去重后: " + uniqueNumbers);
        // 使用TreeSet排序(自動排序)
        TreeSet<Integer> sortedNumbers = new TreeSet<>(uniqueNumbers);
        System.out.println("排序后: " + sortedNumbers);
        // 或者使用Collections.sort()方法
        ArrayList<Integer> sortedList = new ArrayList<>(uniqueNumbers);
        Collections.sort(sortedList);
        System.out.println("使用Collections.sort()排序: " + sortedList);
    }
}

技術(shù)深度解析

1. HashSet去重機制

  • 1.HashSet的工作原理:
    • 基于HashMap實現(xiàn)
    • 利用哈希表快速查找
    • 自動處理重復元素
  • 去重效率分析:
    • 時間復雜度:O(n)
    • 空間復雜度:O(n)
    • 比手動去重(O(n²))高效得多
  • 2. 兩種排序方式對比
    • 方式一:TreeSet自動排序
    • TreeSet<Integer> sortedNumbers = new TreeSet<>(uniqueNumbers);
  • 特點:
    • 自動維護元素順序
    • 基于紅黑樹實現(xiàn)
    • 插入時即排序,查詢效率高
  • 方式二:Collections.sort()
    • ArrayList<Integer> sortedList = new ArrayList<>(uniqueNumbers); Collections.sort(sortedList);
  • 特點:
    • 對現(xiàn)有集合進行排序
    • 基于TimSort算法
    • 更靈活,可自定義比較器

運行結(jié)果展示

原始列表: [5, 2, 8, 2, 1, 9, 5, 3, 7, 1, 4, 6, 8, 3]
去重后: [1, 2, 3, 4, 5, 6, 7, 8, 9]
排序后: [1, 2, 3, 4, 5, 6, 7, 8, 9]
使用Collections.sort()排序: [1, 2, 3, 4, 5, 6, 7, 8, 9]

高級特性擴展

1. 自定義對象去重

對于自定義對象,需要重寫equals()和hashCode()方法:

class Student {
    private String id;
    private String name;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(id, student.id);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

2. 自定義排序規(guī)則

// 降序排序
TreeSet<Integer> descendingSet = new TreeSet<>(Collections.reverseOrder());
descendingSet.addAll(uniqueNumbers);
// 自定義對象排序
TreeSet<Student> studentSet = new TreeSet<>(
    Comparator.comparing(Student::getName)
              .thenComparing(Student::getAge)
);

集合框架選擇指南

根據(jù)需求選擇合適的集合

需求

推薦集合

理由

快速查找

HashMap/HashSet

O(1)時間復雜度

保持插入順序

LinkedHashMap/LinkedHashSet

維護插入順序

自動排序

TreeMap/TreeSet

紅黑樹實現(xiàn)自動排序

線程安全

ConcurrentHashMap/Collections.synchronizedSet

多線程環(huán)境使用

性能對比分析

操作

ArrayList

HashSet

TreeSet

添加

O(1) 

O(1)

O(log n)

查找

O(n)

O(1)

O(log n)

刪除

O(n)

O(1)

O(log n)

排序

O(n log n)

不支持

自動排序

實際應用場景

單詞統(tǒng)計器的應用

  • 搜索引擎:關(guān)鍵詞頻率分析
  • 社交媒體:熱點話題挖掘
  • 學術(shù)研究:文獻關(guān)鍵詞分析
  • 商業(yè)智能:客戶反饋分析

數(shù)據(jù)去重排序的應用

  • 數(shù)據(jù)分析:數(shù)據(jù)清洗和預處理
  • 數(shù)據(jù)庫操作:結(jié)果集去重
  • 推薦系統(tǒng):用戶興趣標簽處理
  • 緩存系統(tǒng):唯一標識管理

最佳實踐總結(jié)

  • 選擇合適的初始容量:避免頻繁擴容
  • 重寫hashCode和equals:確保自定義對象正確工作
  • 使用泛型:提高類型安全性
  • 考慮線程安全:多線程環(huán)境使用并發(fā)集合
  • 利用Java 8+特性:Stream API和Lambda表達式簡化代碼

通過這兩個實戰(zhàn)案例,我們不僅掌握了HashMap和HashSet的基本用法,還深入理解了它們在不同場景下的應用技巧。這些知識將為你在實際開發(fā)中處理復雜數(shù)據(jù)問題提供有力的工具和支持。

到此這篇關(guān)于Java集合框架實戰(zhàn)HashMap與HashSet的使用案例的文章就介紹到這了,更多相關(guān)Java HashMap與HashSet使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WIN7系統(tǒng)JavaEE(java)環(huán)境配置教程(一)

    WIN7系統(tǒng)JavaEE(java)環(huán)境配置教程(一)

    這篇文章主要介紹了WIN7系統(tǒng)JavaEE(java+tomcat7+Eclipse)環(huán)境配置教程,本文重點在于java配置,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java笛卡爾積算法原理與實現(xiàn)方法詳解

    Java笛卡爾積算法原理與實現(xiàn)方法詳解

    這篇文章主要介紹了Java笛卡爾積算法原理與實現(xiàn)方法,結(jié)合實例形式較為詳細的分析了笛卡爾積算法的原理及java定義與使用笛卡爾積算法的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • SpringBoot項目發(fā)送釘釘消息功能實現(xiàn)

    SpringBoot項目發(fā)送釘釘消息功能實現(xiàn)

    在工作中的一些告警需要發(fā)送釘釘通知,有的是發(fā)給個人,有的要發(fā)到群里,這時項目就需要接入釘釘,實現(xiàn)發(fā)消息的功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-02-02
  • MyBatis動態(tài)SQL實現(xiàn)配置過程解析

    MyBatis動態(tài)SQL實現(xiàn)配置過程解析

    這篇文章主要介紹了MyBatis動態(tài)SQL實現(xiàn)配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot超詳細講解集成Flink的部署與打包方法

    SpringBoot超詳細講解集成Flink的部署與打包方法

    昨天折騰了下SpringBoot與Flink集成,實際上集成特簡單,主要是部署打包的問題折騰了不少時間。想打出的包直接可以java -jar運行,同時也可以flink run運行,或者在flink的dashboard上上傳點擊啟動。結(jié)果是不行,但是使用不同的插件打包還是可以的
    2022-05-05
  • SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能(最新推薦)

    SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能(最新推薦)

    這篇文章主要介紹了SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • 淺析SpringBoot自動裝配的實現(xiàn)

    淺析SpringBoot自動裝配的實現(xiàn)

    springboot開箱即用,其實實現(xiàn)了自動裝配,本文重點給大家介紹SpringBoot是如何做到自動裝配的,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • MyBatis-Plus自定義SQL和復雜查詢的實現(xiàn)

    MyBatis-Plus自定義SQL和復雜查詢的實現(xiàn)

    MyBatis-Plus增強了MyBatis的功能,提供注解和XML兩種自定義SQL方式,支持復雜查詢?nèi)缍啾黻P(guān)聯(lián)、動態(tài)分頁等,通過注解如@Select、@Insert、@Update、@Delete實現(xiàn)CRUD操作,本文就來介紹一下,感興趣的可以了解一下
    2024-10-10
  • Java 8 Optional.ofNullable() 方法如何優(yōu)雅處理 null 值

    Java 8 Optional.ofNullable() 方法如何優(yōu)雅處理 nu

    Optional.ofNullable()是Java8用于安全包裝可能為null值的工具,避免空指針異常,相比Optional.of(),它能容忍null并返回空對象,本文給大家介紹Java8 Optional.ofNullable()方法如何優(yōu)雅處理null值,感興趣的朋友一起看看吧
    2025-09-09
  • Java遠程debug調(diào)試的操作步驟

    Java遠程debug調(diào)試的操作步驟

    日常項目中,通常我們的代碼都是部署到遠程的服務器,有時線上出現(xiàn)了問題,經(jīng)常需要我們增加一些日志來排查問題,但是如果是測試環(huán)境的場景下或者我們能進行遠程調(diào)試的話,我們就可以使用遠程的Debug方式進行遠程調(diào)試,下面給大家介紹一下Java遠程debug調(diào)試的操作步驟
    2025-04-04

最新評論

襄城县| 杨浦区| 泗水县| 克拉玛依市| 古蔺县| 香港| 环江| 墨竹工卡县| 九江县| 大悟县| 嘉义县| 托克逊县| 邯郸县| 仪征市| 江都市| 神池县| 泉州市| 抚远县| 旌德县| 北票市| 平乡县| 濉溪县| 瑞安市| 樟树市| 饶阳县| 西安市| 曲靖市| 齐河县| 大足县| 修文县| 福建省| 宁河县| 精河县| 安化县| 家居| 桓仁| 洛宁县| 安国市| 蒙城县| 仙桃市| 黄大仙区|