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.mzph.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] …