Java Set<String>:如何高效判斷是否包含指定字符串?

在 Java 開發中,我們經常使用 Set 集合來存儲一組唯一性的元素。特別是 HashSet,由于其基于哈希表的實現,在進行元素查找(判斷是否包含)時通常具有非常高的效率(平均時間復雜度 O(1))。

那么,當我們需要判斷一個 Set<String> 是否包含一個或多個特定的字符串時,有哪些方法可以使用呢?這取決于你的具體需求:你是想判斷是否包含某個特定字符串,是否包含另一個集合中所有的字符串,還是是否包含另一個集合中任意一個字符串?

本文將為你一一解答,并提供相應的代碼示例。

首先,我們創建一個示例 Set<String> 用于演示:

import java.util.HashSet;
import java.util.Set;
import java.util.Arrays;// 創建一個示例 Set
Set<String> mySet = new HashSet<>(Arrays.asList("apple", "banana", "cherry", "date"));System.out.println("原始 Set: " + mySet);

1. 判斷是否包含某個特定字符串

這是最常見也最簡單的場景。Set 接口提供了 contains() 方法來完成這個任務。

mySet.contains(element) 方法會檢查 mySet 中是否存在與 element 相等的元素。對于 String 類型,相等性是通過 equals() 方法判斷的。

// 示例 1: 判斷是否包含 "banana"
String target1 = "banana";
boolean containsTarget1 = mySet.contains(target1);
System.out.println("Set 包含 '" + target1 + "': " + containsTarget1); // 輸出: Set 包含 'banana': true// 示例 2: 判斷是否包含 "grape"
String target2 = "grape";
boolean containsTarget2 = mySet.contains(target2);
System.out.println("Set 包含 '" + target2 + "': " + containsTarget2); // 輸出: Set 包含 'grape': false

總結: 判斷單個字符串是否存在,直接使用 set.contains(string),高效且直觀。

2. 判斷是否包含另一個集合中所有字符串

如果你有一組字符串(例如放在另一個 ListSet 中),想知道你的 mySet 是否完全包含了這組字符串中的所有元素,可以使用 containsAll() 方法。

mySet.containsAll(collection) 方法會檢查 mySet 是否包含 collection 中所有的元素。

import java.util.Collection; // containsAll 接受 Collection 作為參數// 示例 1: 判斷是否包含集合 ["banana", "cherry"] 中的所有元素
Collection<String> stringsToCheckAll1 = new HashSet<>(Arrays.asList("banana", "cherry"));
boolean containsAll1 = mySet.containsAll(stringsToCheckAll1);
System.out.println("Set 包含所有 " + stringsToCheckAll1 + " 中的元素: " + containsAll1); // 輸出: true// 示例 2: 判斷是否包含集合 ["banana", "fig"] 中的所有元素
Collection<String> stringsToCheckAll2 = new HashSet<>(Arrays.asList("banana", "fig"));
boolean containsAll2 = mySet.containsAll(stringsToCheckAll2);
System.out.println("Set 包含所有 " + stringsToCheckAll2 + " 中的元素: " + containsAll2); // 輸出: false (因為缺少 "fig")

總結: 判斷是否包含另一個集合中的所有元素,使用 set.containsAll(collection).

3. 判斷是否包含另一個集合中任意一個字符串

這個場景是想知道 mySet 中是否存在另一個集合(比如 checkCollection)中的至少一個字符串。

遺憾的是,Java 的 Set 接口沒有直接提供一個類似 containsAny() 的方法。但是,我們可以通過遍歷或 Stream API 來實現。

3.1. 傳統 for 循環方式

遍歷要檢查的字符串集合,對每一個字符串調用 mySet.contains()。一旦找到匹配的字符串,就可以立即停止遍歷并返回 true

// 示例 1: 判斷是否包含集合 ["fig", "date", "grape"] 中的任意一個元素
Collection<String> stringsToCheckAny1 = new HashSet<>(Arrays.asList("fig", "date", "grape"));
boolean containsAny1 = false;
for (String s : stringsToCheckAny1) {if (mySet.contains(s)) {containsAny1 = true;break; // 找到一個就夠了,提前退出循環}
}
System.out.println("Set 包含任意一個 " + stringsToCheckAny1 + " 中的元素: " + containsAny1); // 輸出: true (因為包含 "date")// 示例 2: 判斷是否包含集合 ["fig", "grape"] 中的任意一個元素
Collection<String> stringsToCheckAny2 = new HashSet<>(Arrays.asList("fig", "grape"));
boolean containsAny2 = false;
for (String s : stringsToCheckAny2) {if (mySet.contains(s)) {containsAny2 = true;break;}
}
System.out.println("Set 包含任意一個 " + stringsToCheckAny2 + " 中的元素: " + containsAny2); // 輸出: false
3.2. 使用 Java 8 Stream API

利用 Stream 的 anyMatch() 方法,可以更簡潔地表達上述邏輯。

// 示例 1: 使用 Stream API 判斷是否包含集合 ["fig", "date", "grape"] 中的任意一個元素
Collection<String> stringsToCheckAny1 = new HashSet<>(Arrays.asList("fig", "date", "grape"));
boolean containsAnyStream1 = stringsToCheckAny1.stream().anyMatch(mySet::contains);
System.out.println("(Stream) Set 包含任意一個 " + stringsToCheckAny1 + " 中的元素: " + containsAnyStream1); // 輸出: true// 示例 2: 使用 Stream API 判斷是否包含集合 ["fig", "grape"] 中的任意一個元素
Collection<String> stringsToCheckAny2 = new HashSet<>(Arrays.asList("fig", "grape"));
boolean containsAnyStream2 = stringsToCheckAny2.stream().anyMatch(mySet::contains);
System.out.println("(Stream) Set 包含任意一個 " + stringsToCheckAny2 + " 中的元素: " + containsAnyStream2); // 輸出: false

這里的 mySet::contains 是一個方法引用,等價于 s -> mySet.contains(s)anyMatch() 會遍歷 Stream 中的元素,只要 mySet.contains() 對其中任意一個元素返回 trueanyMatch() 就會立即返回 true 并停止進一步處理。

總結: 判斷是否包含另一個集合中的任意一個元素,需要遍歷或使用 Stream 的 anyMatch()。Stream 方式代碼更簡潔。

總結

場景方法/實現方式效率 (HashSet)
包含某個特定字符串set.contains(string)平均 O(1)
包含另一個集合中所有字符串set.containsAll(collection)平均 O(N) (N 是檢查集合大小)
包含另一個集合中任意一個字符串遍歷檢查集合,對每個元素調用 set.contains()平均 O(N) (N 是檢查集合大小,最壞情況)
包含另一個集合中任意一個字符串Stream API + anyMatch(set::contains)平均 O(N) (N 是檢查集合大小,最壞情況)

請根據你的具體需求,選擇最適合的方法來判斷 Set<String> 是否包含指定的字符串。對于 HashSet 來說,contains() 方法的平均 O(1) 效率是其核心優勢,這也是為什么在需要頻繁進行元素查找的場景下,我們常常選擇使用 Set

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903780.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903780.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903780.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL 查找指定表名的表的主鍵

原理 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME 表名 AND CONSTRAINT_NAME PRIMARY方法 public static String getPk(String tableName) {String sql "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TA…

Java大廠面試突擊:從Spring Boot自動配置到Kafka分區策略實戰解析

第一輪核心知識 面試官:請解釋Spring Boot中自動配置的工作原理并演示如何自定義一個@ConfigurationProperties組件? xbhog:自動配置通過EnableAutoConfiguration注解觸發,結合當前環境判斷(如是否檢測到MyBatis依賴)和條件注解(@ConditionalOnClass)來決定是否啟用配…

開發板型號 ESP32-DevKitC-32模塊型號 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3

以下是關于開發板型號 ESP32-DevKitC-32、模塊型號 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3 的詳細介紹&#xff1a; 開發板型號&#xff1a;ESP32-DevKitC-32 概述&#xff1a;ESP32-DevKitC 是樂鑫推出的一款基于 ESP32 模組的小型開發板&#xff0c;板上模組的絕大部…

數據庫系統綜合應用與深度實踐指南

前言 在當今數據驅動的時代&#xff0c;數據庫技術已成為信息系統的核心支柱。從簡單的數據存儲到復雜的企業級應用&#xff0c;數據庫系統支撐著現代社會的方方面面。本文作為一篇綜合性的數據庫科普文章&#xff0c;旨在為讀者提供從基礎到進階的完整知識體系&#xff0c;涵…

vscode 的空格和 tab 設置 與 Rime 自建詞庫

自動保存&#xff08;多用于失去焦點時保存&#xff09; Files: Auto Save 推薦不勾 保存時格式化&#xff08;Pritter 插件的功能&#xff0c;自動使用 Pritter 的格式&#xff09; Editor: Format On Save 推薦不勾 tab 的空格數量&#xff0c;2 或 4 Editor: Tab Size 推薦…

【Python爬蟲詳解】第五篇:使用正則表達式提取網頁數據

在前面幾篇文章中&#xff0c;我們介紹了幾種強大的HTML解析工具&#xff1a;BeautifulSoup、XPath和PyQuery。這些工具都是基于HTML結構來提取數據的。然而&#xff0c;有時我們需要處理的文本可能沒有良好的結構&#xff0c;或者我們只關心特定格式的字符串&#xff0c;這時正…

論文報錯3

idm不讓用&#xff1a; powershell管理員運行&#xff1a; irm https://raw.githubusercontent.com/lstprjct/IDM-Activation-Script/main/IAS.ps1 | iex 選擇1&#xff1a; 輸入9&#xff1a;

數據結構-樹(二叉樹、紅黑、B、B+等)

?樹的基本定義? 樹的定義 樹&#xff08;Tree&#xff09;?? 是一種 ??非線性數據結構??&#xff0c;由 ??節點&#xff08;Node&#xff09;?? 和 ??邊&#xff08;Edge&#xff09;?? 組成&#xff0c;滿足以下條件&#xff1a; ??有且僅有一個根節點&am…

【Android】四大組件

目錄 1. Activity 2. Service 3. BroadcastReceiver 4. ContentProvider 四大組件各自承擔著不同的職責&#xff0c;彼此之間協同工作&#xff0c;共同為用戶提供一個流暢的APP體驗。 1. Activity 負責展示用戶界面&#xff0c;就像App的一個個“頁面”&#xff0c;用戶通…

Java 多線程進階:線程安全、synchronized、死鎖、wait/notify 全解析(含代碼示例)

在 Java 并發編程中&#xff0c;“線程安全” 是核心議題之一。本文將深入講解線程安全的實現手段、synchronized 的使用方式、可重入鎖、死鎖的成因與避免、wait/notify 通信機制等&#xff0c;并配合實際代碼案例&#xff0c;幫助你徹底搞懂 Java 線程協作機制。 一、線程安全…

高并發場景下的MySQL生存指南

引言 在2025年全球數字經濟峰會上&#xff0c;阿里云披露其核心交易系統單日處理請求量突破萬億次&#xff0c;其中MySQL集群承載了78%的OLTP業務。這標志著數據庫系統已進入百萬級QPS時代&#xff0c;傳統優化手段面臨三大挑戰&#xff1a; 一、硬件與架構優化&#xff1a;構…

MCP入門

什么是mcp mcp&#xff08;model context protocol&#xff0c;模型上下文協議&#xff09; 標準化協議&#xff1a;讓大模型用統一的方式來調用工具&#xff0c;是llm和工具之間的橋梁 A2A&#xff1a;Agent-to-Agent協議 mcp通信機制 提供mcp服務查詢的平臺 具有工具合集…

服務容錯治理框架resilience4jsentinel基礎應用---微服務的限流/熔斷/降級解決方案

繼續上一章未完成的sentinel&#xff1b; 直接實操&#xff1b; 關于測試&#xff1a;本文使用線程池線程異步執行模擬并發結合Mock框架測試 其他文章 服務容錯治理框架resilience4j&sentinel基礎應用---微服務的限流/熔斷/降級解決方案-CSDN博客 conda管理python環境-…

深入理解 C 語言中的變量作用域與鏈接性:`extern`、`static` 與全局變量

深入理解 C 語言中的變量作用域與鏈接性&#xff1a;extern、static 與全局變量 在 C 語言中&#xff0c;變量的作用域&#xff08;Scope&#xff09;和鏈接性&#xff08;Linkage&#xff09;是理解程序結構和模塊化的關鍵概念。本文將詳細探討在函數外定義的變量是否為全局變…

實驗三 軟件黑盒測試

實驗三 軟件黑盒測試使用測試界的一個古老例子---三角形問題來進行等價類劃分。輸入三個整數a、b和c分別作為三角形的三條邊&#xff0c;通過程序判斷由這三條邊構成的三角形類型是等邊三角形、等腰三角形、一般三角形或非三角形(不能構成一個三角形)。其中要求輸入變量&#x…

小米首個推理大模型開源——Xiaomi MiMo,為推理而戰!

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄 一、MiMo的驚人表現&#xff1a;小參數量&#xff0c;大能力二、雙輪驅動&#…

《2025全球機器學習技術大會:阿里云講師張玉明深度剖析通義靈碼AI程序員》

4 月 18 日 - 19 日&#xff0c;由 CSDN & Boolan 聯合舉辦的 2025 全球機器學習技術大會&#xff08;ML-Summit&#xff09;于上海順利舉行。大會聚焦人工智能與機器學習前沿技術&#xff0c;匯聚了來自科技與人工智能領域的數位頂尖專家以及數千名開發者和研究者&#xf…

MySQL事務隔離級別詳解

MySQL事務隔離級別詳解 事務隔離級別概述 MySQL支持四種標準的事務隔離級別&#xff0c;它們定義了事務在并發環境下的可見性規則和可能出現的并發問題&#xff1a; READ UNCOMMITTED&#xff08;讀未提交&#xff09; ? 最低隔離級別 ? 事務可以讀取其他事務未提交的數據&…

計算機視覺(CV)技術的優勢和挑戰(本片為InsCode)

計算機視覺&#xff08;CV&#xff09;技術是一種利用計算機和算法來模擬人類視覺實現圖像和視頻處理的技術。它在各個領域都有著廣泛的應用&#xff0c;具有許多優勢和挑戰。 優勢&#xff1a; 自動化&#xff1a;CV 技術可以自動識別、分類、跟蹤和分析圖像和視頻數據&…

Android JIT編譯:adb shell cmd package compile選項

Android JIT編譯&#xff1a;adb shell cmd package compile選項 例如&#xff1a; adb shell cmd package compile -m speed -f --full 包名 配置參數指令說明&#xff1a; compile [-r COMPILATION_REASON] [-m COMPILER_FILTER] [-p PRIORITY] [-f] [--primary-dex] …