Java 的 String.indexOf() 方法默认是区分大小写的,这意味着在搜索子字符串时,它会精确匹配字符的大小写形式。

默认行为:区分大小写
indexOf 方法会查找子字符串在字符串中首次出现的索引,如果找不到则返回 -1,它的比较是基于字符的 Unicode 值进行的,'A' 和 'a' 被视为不同的字符。
示例代码:
public class IndexOfCaseExample {
public static void main(String[] args) {
String str = "Hello World, Java is great!";
// 查找 "Java" (J大写)
int index1 = str.indexOf("Java");
System.out.println("查找 'Java' 的索引: " + index1); // 输出: 13
// 查找 "java" (j小写)
int index2 = str.indexOf("java");
System.out.println("查找 'java' 的索引: " + index2); // 输出: -1 (因为找不到)
// 查找 "WORLD" (全大写)
int index3 = str.indexOf("WORLD");
System.out.println("查找 'WORLD' 的索引: " + index3); // 输出: -1 (因为 'W' 后面是 'o' 小写)
// 查找 "world" (w小写)
int index4 = str.indexOf("world");
System.out.println("查找 'world' 的索引: " + index4); // 输出: 6
}
}
输出结果:
查找 'Java' 的索引: 13
查找 'java' 的索引: -1
查找 'WORLD' 的索引: -1
查找 'world' 的索引: 6
从上面的例子可以清楚地看到,indexOf 严格按照你提供的大小写形式进行匹配。
如何实现不区分大小写的查找?
如果你需要进行不区分大小写的查找,Java 提供了非常方便的工具类,主要有两种推荐方法:

使用 String.equalsIgnoreCase() (推荐)
这是最直接、最简单的方法,你可以先将主字符串和要查找的子字符串都转换成统一的大小写形式(都转换成小写或都转换成大写),然后再进行 indexOf 操作。
示例代码:
public class CaseInsensitiveIndexOf {
public static void main(String[] args) {
String str = "Hello World, Java is great!";
// 将主字符串和子字符串都转换为小写,再查找
String lowerStr = str.toLowerCase(); // "hello world, java is great!"
String searchLower = "java".toLowerCase(); // "java"
int index1 = lowerStr.indexOf(searchLower);
System.out.println("不区分大小写查找 'java' 的索引: " + index1); // 输出: 13
// 也可以转换为大写
String upperStr = str.toUpperCase(); // "HELLO WORLD, JAVA IS GREAT!"
String searchUpper = "WORLD".toUpperCase(); // "WORLD"
int index2 = upperStr.indexOf(searchUpper);
System.out.println("不区分大小写查找 'WORLD' 的索引: " + index2); // 输出: 6
}
}
优点:
- 代码直观易懂。
- 是最常用的解决方案。
使用 java.text.Collator (更强大的国际化支持)
Collator 类是 Java 用于语言环境敏感的字符串比较的类,它不仅可以处理大小写,还可以处理不同语言的排序规则(德语中的 和 ss 视为相同)。

示例代码:
import java.text.Collator;
import java.util.Locale;
public class CollatorIndexOf {
public static void main(String[] args) {
String str = "Hello World, Java is great!";
// 创建一个不区分大小写的 Collator 实例
Collator collator = Collator.getInstance(Locale.ENGLISH);
collator.setStrength(Collator.PRIMARY); // PRIMARY 意味着只比较基本字符,忽略大小写和重音
// Collator 没有直接提供 indexOf 方法,但我们可以用它来辅助判断
// 这里展示一个手动实现不区分大小写查找的逻辑
String searchFor = "JAVA";
int index = -1;
for (int i = 0; i <= str.length() - searchFor.length(); i++) {
String substring = str.substring(i, i + searchFor.length());
if (collator.equals(substring, searchFor)) {
index = i;
break;
}
}
System.out.println("使用 Collator 查找 '" + searchFor + "' 的索引: " + index); // 输出: 13
}
}
说明:
Collator.getInstance(): 获取一个适合特定语言环境的Collator。setStrength(Collator.PRIMARY): 设置比较强度。PRIMARY是最不严格的级别,只比较字符是否相同,忽略大小写、音调等。- 注意:
Collator本身不提供indexOf方法,所以需要自己遍历字符串并使用collator.equals()来进行比较,这个方法更强大,但代码也更复杂。
优点:
- 功能强大,支持复杂的国际化比较规则。
- 对于简单的“忽略大小写”需求,有点“杀鸡用牛刀”。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
String.indexOf() |
性能最好,API 简单 | 默认区分大小写 | 当你明确需要区分大小写的精确匹配时。 |
toLowerCase().indexOf() |
代码简单直观,易于理解和维护 | 创建了新的字符串对象,可能会有轻微的性能开销(通常可以忽略不计) | 绝大多数不区分大小写的查找场景,是首选方案。 |
java.text.Collator |
功能最强大,支持复杂的语言环境敏感比较 | 代码复杂,性能相对较低 | 需要进行国际化(i18n)处理,或者有非常特殊的字符串比较规则时。 |
最佳实践
在 Java 中,如果你需要进行不区分大小写的子字符串查找,最推荐、最简洁的方法是使用 toLowerCase() 或 toUpperCase() 结合 indexOf()。
// 推荐写法
String source = "This is a Test String";
String target = "test";
int index = source.toLowerCase().indexOf(target.toLowerCase());
if (index != -1) {
System.out.println("找到匹配项,索引为: " + index);
} else {
System.out.println("未找到匹配项。");
} 