String.contains() 方法是区分大小写的。

这意味着,当你使用 contains() 检查一个字符串是否包含另一个子字符串时,字符的大小写必须完全匹配。
contains() 的基本用法和大小写敏感性
contains() 方法的签名是:
boolean contains(CharSequence s)
它接收一个 CharSequence(通常是 String)作为参数,如果调用字符串中包含该参数字符串,则返回 true,否则返回 false。
示例:区分大小写

public class ContainsExample {
public static void main(String[] args) {
String mainString = "Hello, World!";
// 情况1:完全匹配(小写)
System.out.println(mainString.contains("hello")); // 输出: false
// 情况2:完全匹配(大写)
System.out.println(mainString.contains("Hello")); // 输出: true
// 情况3:部分匹配,但大小写不一致
System.out.println(mainString.contains("world")); // 输出: false
// 情况4:部分匹配,大小写一致
System.out.println(mainString.contains("World")); // 输出: true
// 情况5:检查不存在的字符
System.out.println(mainString.contains("Java")); // 输出: false
}
}
输出结果:
false
true
false
true
false
从上面的例子可以清楚地看到,contains() 对大小写是敏感的。"Hello" 能找到,但 "hello" 找不到。
如何进行不区分大小写的检查?
在实际开发中,我们经常需要进行不区分大小写的检查,有几种常见的方法可以实现。
将两个字符串都转换为统一的大小写(推荐)
这是最常用、最简单、最清晰的方法,你可以将主字符串和要查找的子字符串都转换为小写或大写,然后再进行比较。

使用 toLowerCase()
String mainString = "Hello, World!"; String subString = "hello"; // 将两个字符串都转换为小写后再检查 boolean isContainsIgnoreCase = mainString.toLowerCase().contains(subString.toLowerCase()); System.out.println(isContainsIgnoreCase); // 输出: true
使用 toUpperCase()
String mainString = "Hello, World!"; String subString = "WORLD"; // 将两个字符串都转换为大写后再检查 boolean isContainsIgnoreCase = mainString.toUpperCase().contains(subString.toUpperCase()); System.out.println(isContainsIgnoreCase); // 输出: true
优点:
- 代码直观易懂。
- 性能较好,因为只调用了两次
toLowerCase()/toUpperCase()方法。
使用 String.indexOf() 方法
String.indexOf(String str) 方法也区分大小写,但它可以接受一个忽略大小写的参数 String str, int fromIndex 的重载形式(实际上没有直接的重载,但我们可以结合 toLowerCase() 或使用正则表达式),更直接的方式是和 toLowerCase() 结合使用。
String mainString = "Hello, World!"; String subString = "world"; // 将主字符串转换为小写,然后在小写版本中查找小写的子字符串 boolean isContainsIgnoreCase = mainString.toLowerCase().indexOf(subString.toLowerCase()) != -1; System.out.println(isContainsIgnoreCase); // 输出: true
这种方式和方法一原理相同,只是使用了 indexOf() 的返回值来判断。
使用正则表达式(Pattern 和 Matcher)
对于更复杂的匹配规则,正则表达式是一个非常强大的工具,我们可以使用 Pattern.CASE_INSENSITIVE 标志来实现不区分大小写的匹配。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexContainsExample {
public static void main(String[] args) {
String mainString = "Hello, World!";
String subString = "HELLO";
// 编译正则表达式,并设置不区分大小写的标志
Pattern pattern = Pattern.compile(Pattern.quote(subString), Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(mainString);
// 如果找到匹配项,则返回 true
boolean isContainsIgnoreCase = matcher.find();
System.out.println(isContainsIgnoreCase); // 输出: true
}
}
说明:
Pattern.quote(subString)是一个好习惯,它会将subString中的任何特殊正则字符(如 、、 等)进行转义,确保你是在查找字面意义上的字符串,而不是正则表达式模式。- 这种方法功能最强大,但代码也最复杂,对于简单的
contains检查来说有点“杀鸡用牛刀”。
性能比较
对于简单的不区分大小写检查,方法一(toLowerCase().contains())通常是最佳选择,因为它:
- 代码简洁:可读性最高。
- 性能良好:
toLowerCase()的开销很小,对于大多数应用场景来说完全可以接受。
正则表达式方法(方法三)虽然灵活,但在这种简单任务上,其初始化 Pattern 和 Matcher 对象的开销会更大。
| 方法 | 描述 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
contains() |
区分大小写 | 简单、快速 | 功能有限 | 当大小写必须严格匹配时 |
toLowerCase().contains() |
不区分大小写 | 代码简洁、性能好、可读性高 | 无明显缺点 | 绝大多数不区分大小写的检查场景 |
| 正则表达式 | 不区分大小写 | 功能极其强大,可处理复杂模式 | 代码复杂,性能开销相对较大 | 需要复杂匹配规则(如查找多个模式、边界等)时 |
记住这个核心:String.contains() 默认是区分大小写的,当你需要忽略大小时,最简单的方法就是 mainString.toLowerCase().contains(subString.toLowerCase())。
