Java集合框架實戰(zhàn)HashMap與HashSet的使用案例
在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+tomcat7+Eclipse)環(huán)境配置教程,本文重點在于java配置,感興趣的小伙伴們可以參考一下2016-06-06
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)配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03
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ù)加解密功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06
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)雅處理 nu
Optional.ofNullable()是Java8用于安全包裝可能為null值的工具,避免空指針異常,相比Optional.of(),它能容忍null并返回空對象,本文給大家介紹Java8 Optional.ofNullable()方法如何優(yōu)雅處理null值,感興趣的朋友一起看看吧2025-09-09

