Java String contains() 方法(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在 Java 编程中,字符串(String)是使用频率极高的数据类型。无论是处理用户输入、解析配置文件,还是验证数据格式,我们都需要频繁地对字符串进行操作。而 Java String contains() 方法
是其中最基础且实用的功能之一,它能够快速判断一个字符串是否包含指定的子字符串或字符序列。对于编程初学者而言,掌握这一方法能显著提升代码效率和可读性;而中级开发者则可以通过深入理解其底层原理和常见误区,进一步优化代码逻辑。本文将从基础到进阶,结合案例与代码示例,全面解析这一方法的使用场景与核心要点。
基础用法:快速判断字符串是否包含子串
方法定义与语法
contains()
方法是 Java String
类中的一个实例方法,其语法格式如下:
boolean contains(CharSequence cs)
此方法接收一个 CharSequence
类型的参数(如字符串、字符数组等),返回一个布尔值:若当前字符串包含该参数所表示的子字符串,则返回 true
,否则返回 false
。
示例代码与输出
public class ContainsExample {
public static void main(String[] args) {
String text = "Hello, World!";
boolean result1 = text.contains("Hello");
boolean result2 = text.contains("world");
boolean result3 = text.contains("!");
System.out.println("包含 'Hello':" + result1); // 输出:true
System.out.println("包含 'world':" + result2); // 输出:false(区分大小写)
System.out.println("包含 '!':" + result3); // 输出:true
}
}
通过上述代码可见,contains()
方法对大小写敏感,且能精准匹配单个字符或连续字符序列。
核心原理:如何高效判断包含关系
字符串的内部存储结构
Java 中的字符串(String
)是不可变对象,其底层通过 char[]
数组存储字符序列。例如,字符串 "Java"
在内存中被表示为 { 'J', 'a', 'v', 'a' }
。当调用 contains()
方法时,Java 会遍历目标字符串的字符数组,并尝试在其中找到与输入参数完全匹配的连续子序列。
查找逻辑的比喻
可以将字符串想象成一本打开的书,每个字符是书页上的文字。contains()
方法就像一位快速翻页的读者,逐行检查是否能找到目标关键词。若找到,则立即返回 true
;若遍历完整个字符串仍未找到,则返回 false
。
进阶技巧:常见场景与扩展应用
场景一:验证数据格式
在表单验证或数据解析时,contains()
方法能快速判断字符串是否符合特定规则。例如,验证邮箱地址是否包含 @
符号:
public static boolean isValidEmail(String email) {
return email.contains("@") && email.contains(".");
}
此方法会检查邮箱地址是否同时包含 @
和 .
,但需注意:此仅为简单示例,实际应用中需结合正则表达式实现更严格的验证。
场景二:过滤敏感词
在社交平台或评论系统中,常需过滤包含敏感词的内容。例如:
public static boolean isSensitiveContent(String content) {
List<String> sensitiveWords = Arrays.asList("违法", "违规");
for (String word : sensitiveWords) {
if (content.contains(word)) {
return true;
}
}
return false;
}
此代码遍历敏感词列表,若发现任意一个词存在于输入内容中,则返回 true
。
场景三:配置文件解析
在读取配置文件时,可通过 contains()
方法快速定位关键参数:
public static String getConfigValue(String configLine, String key) {
if (configLine.contains(key)) {
return configLine.split("=")[1];
}
return null;
}
例如,输入 port=8080
,调用 getConfigValue(line, "port")
将返回 "8080"
。
常见误区与注意事项
误区一:忽略大小写问题
由于 contains()
方法区分大小写,若需不区分大小写判断,可先将字符串转换为统一格式:
// 正确写法(不区分大小写)
public boolean containsIgnoreCase(String text, String target) {
return text.toLowerCase().contains(target.toLowerCase());
}
误区二:处理空值或空字符串
若传入的字符串为 null
或空字符串,需提前进行空值校验:
public boolean safeContains(String text, String target) {
if (text == null || text.isEmpty()) {
return false;
}
return text.contains(target);
}
误区三:与 equals()
方法混淆
contains()
判断的是“是否包含子串”,而 equals()
判断的是“是否完全相等”。例如:
"Hello".contains("He") // true
"Hello".equals("He") // false
性能优化与替代方案
方法性能分析
contains()
方法的时间复杂度为 O(n),其中 n 是目标字符串的长度。对于极长的字符串(如百万级字符),可考虑以下优化:
- 提前终止条件:若已知目标子串长度大于当前字符串,可直接返回
false
。 - 使用正则表达式:通过
Pattern
类的预编译功能加速匹配。
替代方案:indexOf()
方法
indexOf()
方法返回子串的起始索引(未找到则返回 -1),与 contains()
的关系如下:
text.contains(substring) == (text.indexOf(substring) != -1)
但 contains()
的代码可读性更高,推荐优先使用。
实战案例:构建敏感词过滤器
需求描述
开发一个简单的敏感词过滤工具,输入文本后返回是否包含敏感词。
实现代码
import java.util.*;
public class SensitiveFilter {
private List<String> sensitiveWords;
public SensitiveFilter(List<String> words) {
this.sensitiveWords = new ArrayList<>(words);
}
public boolean isSensitive(String text) {
if (text == null || text.isEmpty()) {
return false;
}
for (String word : sensitiveWords) {
if (text.contains(word)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
List<String> words = Arrays.asList("敏感词1", "敏感词2");
SensitiveFilter filter = new SensitiveFilter(words);
System.out.println(filter.isSensitive("测试敏感词1")); // 输出:true
}
}
此代码通过遍历敏感词列表,结合 contains()
方法实现高效过滤。
结论
Java String contains() 方法
是字符串处理中的核心工具,其简洁的语法和直观的逻辑使其在各类场景中广泛应用。通过本文的学习,读者不仅能掌握其基础用法,还能理解其底层原理、常见误区及优化技巧。无论是验证数据格式、过滤敏感内容,还是解析配置文件,合理使用 contains()
方法都能显著提升代码效率与可维护性。建议读者在实际项目中多加实践,逐步积累经验,从而更灵活地应对复杂需求。