Java String contains() 方法详解:轻松判断字符串是否包含指定子串
在日常开发中,我们经常需要判断一个字符串里是否包含某个特定的子串。比如验证用户输入的邮箱是否包含“@”符号,或者检查一段文本是否含有敏感词。这时候,Java 提供的 String contains() 方法就派上用场了。它是一个简单却非常实用的工具,尤其适合初学者快速掌握字符串处理的基本操作。
Java String contains() 方法 用于判断一个字符串是否包含指定的子字符串(即子串)。它返回一个布尔值:如果包含,返回 true;否则返回 false。这个方法在文本处理、表单校验、日志分析等场景中极为常见。
方法语法与基本用法
contains() 方法是 String 类的实例方法,定义如下:
public boolean contains(CharSequence s)
其中,CharSequence 是一个接口,String 实现了这个接口,因此你可以传入字符串对象作为参数。
示例 1:基础使用
public class ContainsDemo {
public static void main(String[] args) {
String text = "欢迎学习 Java 编程语言";
// 判断是否包含“Java”这个子串
boolean result = text.contains("Java");
// 输出结果
System.out.println("字符串中是否包含 'Java':" + result); // 输出:true
}
}
中文注释说明:
text.contains("Java")是核心调用,检查text字符串中是否包含“Java”这一子串。- 由于原字符串确实包含“Java”,所以返回
true。System.out.println用于输出判断结果,方便调试和查看。
区分大小写:注意字母的大小写敏感性
Java String contains() 方法 是大小写敏感的。这意味着 "Java" 和 "java" 被视为两个不同的字符串。
示例 2:大小写敏感性演示
public class CaseSensitiveCheck {
public static void main(String[] args) {
String greeting = "Hello World";
// 尝试查找小写的 "hello"
boolean containsHello = greeting.contains("hello");
System.out.println("是否包含 'hello':" + containsHello); // 输出:false
// 正确查找大写的 "Hello"
boolean containsHelloCorrect = greeting.contains("Hello");
System.out.println("是否包含 'Hello':" + containsHelloCorrect); // 输出:true
}
}
中文注释说明:
greeting.contains("hello")返回false,因为原字符串是“Hello”(首字母大写)。- 这说明
contains()不会自动忽略大小写,必须精确匹配。- 如果你需要不区分大小写的查找,可以先将字符串转为统一大小写再判断。
实际应用场景:用户输入校验
在实际项目中,contains() 常用于表单数据校验。例如,验证用户注册时输入的邮箱是否包含“@”和“.”符号。
示例 3:邮箱格式初步校验
public class EmailValidation {
public static void main(String[] args) {
String email = "user@example.com";
// 检查是否包含 '@' 和 '.'
boolean hasAt = email.contains("@");
boolean hasDot = email.contains(".");
if (hasAt && hasDot) {
System.out.println("邮箱格式初步校验通过!");
} else {
System.out.println("邮箱格式不正确,请检查是否包含 '@' 和 '.'");
}
}
}
中文注释说明:
email.contains("@")检查邮箱中是否有“@”符号,这是邮箱的基本特征。email.contains(".")检查是否有“.”,用于分隔域名部分。- 使用
&&连接两个条件,只有同时满足才认为初步校验通过。- 注意:这只是基础校验,更完整的邮箱验证建议使用正则表达式。
处理空值与边界情况
在实际编码中,我们常常需要处理可能为 null 的字符串。如果对 null 调用 contains(),会抛出 NullPointerException。
示例 4:安全使用 contains() 的方式
public class SafeContainsCheck {
public static void main(String[] args) {
String input = null;
// ❌ 错误做法:直接调用会导致空指针异常
// boolean result = input.contains("test"); // 抛出 NullPointerException
// ✅ 正确做法:先判断是否为 null
if (input != null && input.contains("test")) {
System.out.println("包含 'test' 字符串");
} else {
System.out.println("输入为空或不包含 'test'");
}
}
}
中文注释说明:
input != null是前置判断,防止对null调用方法。- 使用短路逻辑
&&,如果input为null,后面的contains()不会被执行。- 这是 Java 编程中非常重要的防御性编程习惯。
性能与底层原理简析
contains() 方法的底层实现是基于 indexOf() 方法。它会从字符串的起始位置开始,逐个字符比对,直到找到匹配的子串或遍历完所有字符。
内部逻辑(简化版):
public boolean contains(CharSequence s) {
return indexOf(s.toString()) >= 0;
}
这意味着:
- 如果子串不存在,方法会遍历整个字符串,时间复杂度为 O(n × m),其中 n 是原字符串长度,m 是子串长度。
- 对于短字符串,性能影响可忽略;但处理超长文本时,建议使用更高效的算法(如 KMP)或正则表达式。
与 indexOf() 的对比:你该用哪个?
虽然 contains() 和 indexOf() 都能判断子串是否存在,但它们的使用场景略有不同。
| 方法 | 返回类型 | 是否返回位置 | 适用场景 |
|---|---|---|---|
contains() |
boolean |
否 | 仅需判断是否存在 |
indexOf() |
int |
是(位置索引) | 需要获取子串位置 |
示例 5:对比使用场景
public class CompareContainsAndIndex {
public static void main(String[] args) {
String sentence = "今天是个好日子,阳光明媚";
// 使用 contains():只需判断是否包含
if (sentence.contains("好日子")) {
System.out.println("找到了关键词 '好日子'!");
}
// 使用 indexOf():不仅判断,还获取位置
int index = sentence.indexOf("好日子");
if (index != -1) {
System.out.println("在位置 " + index + " 找到 '好日子'");
}
}
}
中文注释说明:
sentence.contains("好日子")只关心是否存在,代码简洁。sentence.indexOf("好日子")返回索引,可用于后续操作,如截取子串。- 如果你只需要布尔判断,优先使用
contains(),代码更直观。
常见误区与最佳实践
-
不要忽略空字符串
"".contains("")返回true,即空字符串包含自己。这在逻辑判断时需注意。 -
不要依赖 contains() 做复杂匹配
它无法处理通配符或正则模式。例如contains("a*")不会匹配星号通配符。 -
避免在循环中频繁调用
如果要检查多个关键词,建议将关键词放入集合,统一处理,提升效率。 -
结合 trim() 使用
用户输入可能带空格,建议先去空格再判断:
String input = " Java ";
if (input.trim().contains("Java")) {
System.out.println("匹配成功");
}
总结:掌握 Java String contains() 方法的核心要点
Java String contains() 方法 是字符串处理中不可或缺的工具。它简单、直观、高效,特别适合初学者快速上手。通过本文的学习,你应该已经掌握了:
- 方法的基本语法和返回值
- 大小写敏感的特性
- 实际应用如输入校验
- 空值安全处理
- 与
indexOf()的区别 - 常见误区和最佳实践
在后续开发中,遇到“是否包含某个词”的需求时,别忘了先想想 contains()。它就像一把钥匙,能帮你快速打开字符串判断的大门。记住:写代码不是追求复杂,而是追求清晰和可靠。而 contains(),正是这种简洁智慧的体现。