String.indexOf() 是 Java 字符串类中一个非常常用的方法,它的核心功能是查找某个字符或子字符串在当前字符串中首次出现的位置。

它的返回值主要有以下三种情况,理解这三种情况是掌握该方法的关键。
核心返回值总结
| 查找情况 | 返回值 | 解释 |
|---|---|---|
| 找到 | 一个非负整数 | 从 0 开始的索引值,表示字符或子字符串首次出现的位置。 |
| 未找到 | -1 | 表示在整个字符串中都没有找到目标字符或子字符串。 |
参数为空字符 '\0' |
0 | 这是一个特殊情况,空字符在字符串的起始位置。 |
详细说明与示例
返回非负整数(找到目标)
当目标字符或子字符串存在于调用该方法的字符串中时,indexOf() 会返回其首次出现位置的索引。
- 索引从 0 开始:这意味着字符串的第一个字符的索引是 0,第二个是 1,以此类推。
- 区分大小写:
indexOf()是区分大小写的。'A'和'a'被视为不同的字符。
示例 1:查找字符
public class IndexOfExample {
public static void main(String[] args) {
String str = "Hello, World!";
// 查找字符 'o'
int index1 = str.indexOf('o');
System.out.println("字符 'o' 的索引是: " + index1); // 输出: 4
// 查找字符 'H'
int index2 = str.indexOf('H');
System.out.println("字符 'H' 的索引是: " + index2); // 输出: 0
// 查找字符 'l' (它会返回第一个 'l' 的位置)
int index3 = str.indexOf('l');
System.out.println("字符 'l' 的索引是: " + index3); // 输出: 2
}
}
示例 2:查找子字符串

public class IndexOfExample {
public static void main(String[] args) {
String str = "Java is fun, Java is powerful.";
// 查找子字符串 "Java"
int index1 = str.indexOf("Java");
System.out.println("子字符串 \"Java\" 的索引是: " + index1); // 输出: 0
// 查找子字符串 "is"
int index2 = str.indexOf("is");
System.out.println("子字符串 \"is\" 的索引是: " + index2); // 输出: 5
// 查找子字符串 "powerful"
int index3 = str.indexOf("powerful");
System.out.println("子字符串 \"powerful\" 的索引是: " + index3); // 输出: 20
}
}
返回 -1(未找到目标)
当 indexOf() 在整个字符串中都没有找到指定的字符或子字符串时,它会返回 -1,这个返回值非常重要,通常用于条件判断,以确定某个字符串是否包含特定内容。
示例:
public class IndexOfExample {
public static void main(String[] args) {
String str = "Hello, World!";
// 查找不存在的字符 'z'
int index1 = str.indexOf('z');
System.out.println("字符 'z' 的索引是: " + index1); // 输出: -1
// 查找不存在的子字符串 "Python"
int index2 = str.indexOf("Python");
System.out.println("子字符串 \"Python\" 的索引是: " + index2); // 输出: -1
}
}
实际应用:判断字符串是否包含某个内容
这是 indexOf() 最常见的用法之一。

public class ContainsCheck {
public static void main(String[] args) {
String message = "操作成功完成";
// 使用 indexOf() 检查是否包含 "成功"
if (message.indexOf("成功") != -1) {
System.out.println("消息中包含 '成功'。");
} else {
System.out.println("消息中不包含 '成功'。");
}
// 检查是否包含 "失败"
if (message.indexOf("失败") == -1) {
System.out.println("消息中不包含 '失败'。");
}
}
}
注意:从 Java 1.5 开始,String 类提供了 contains() 方法,它在可读性上更佳,但底层实现通常也是依赖 indexOf()。
// 更现代、可读性更好的方式
if (message.contains("成功")) {
System.out.println("消息中包含 '成功'。");
}
重载方法与 fromIndex 参数
indexOf() 方法有多个重载版本,其中最常用的是带 fromIndex 参数的版本。
语法: int indexOf(int ch, int fromIndex)
语法: int indexOf(String str, int fromIndex)
- 功能:从指定的
fromIndex位置开始,向后查找目标字符或子字符串。 - 返回值规则:
- 如果在
fromIndex之后(包括fromIndex这个位置)找到了目标,返回其索引。 - 如果在
fromIndex之后没有找到,返回-1。 fromIndex可以是 0 到字符串长度()之间的任何值。fromIndex大于或等于字符串长度,直接返回-1。
- 如果在
示例:
public class IndexOfFromIndexExample {
public static void main(String[] args) {
String str = "banana";
// 从索引 2 的位置开始查找字符 'a'
// 会从 'n' (索引2) 开始找,找到第一个 'a' (索引3)
int index1 = str.indexOf('a', 2);
System.out.println("从索引 2 开始查找 'a': " + index1); // 输出: 3
// 从索引 4 的位置开始查找字符 'a'
// 会从 'a' (索引4) 开始找,找到了它自己
int index2 = str.indexOf('a', 4);
System.out.println("从索引 4 开始查找 'a': " + index2); // 输出: 4
// 从索引 5 的位置开始查找字符 'a'
// 从 'a' (索引5) 开始找,后面没有了,所以没找到
int index3 = str.indexOf('a', 5);
System.out.println("从索引 5 开始查找 'a': " + index3); // 输出: -1
// 从索引 6 的位置开始查找字符 'a'
// 超出字符串长度,直接返回 -1
int index4 = str.indexOf('a', 6);
System.out.println("从索引 6 开始查找 'a': " + index4); // 输出: -1
}
}
特殊情况:查找空字符 '\0'
在 Java 中,'\0' 是一个空字符,其 Unicode 值为 0,虽然在 Java 字符串字面量中不常见,但它是一个有效的字符。
- 当你查找
'\0'时,indexOf()会返回它在字符串中的位置。 - 如果字符串中没有显式的空字符,Java 会将字符串末尾的空字符视为存在吗?不会,它会返回
-1。 - 有一种特殊情况:
indexOf('\0')总是返回 0。
示例:
public class IndexOfNullCharExample {
public static void main(String[] args) {
String str = "Hello";
// 查找空字符 '\0'
// 这是一个特例,总是返回 0
int index1 = str.indexOf('\0');
System.out.println("查找空字符 '\\0' 的索引: " + index1); // 输出: 0
// 尝试在字符串中创建一个包含空字符的字符串
String strWithNull = "Hel\0lo";
System.out.println("包含空字符的字符串: " + strWithNull); // 输出: Hel lo (lo前面有一个看不见的空字符)
// 现在查找空字符,它会返回正确的位置
int index2 = strWithNull.indexOf('\0');
System.out.println("在特殊字符串中查找空字符的索引: " + index2); // 输出: 3
}
}
注意:
str.indexOf('\0')返回 0 的行为是一个历史遗留特性,在编写代码时应尽量避免依赖此行为,而应使用contains()或其他更明确的检查方式。
| 方法签名 | 返回值 | 描述 |
|---|---|---|
indexOf(int ch) |
int |
查找字符 ch 首次出现的位置,找到则返回索引,否则返回 -1。 |
indexOf(String str) |
int |
查找子字符串 str 首次出现的位置,找到则返回起始索引,否则返回 -1。 |
indexOf(int ch, int fromIndex) |
int |
从 fromIndex 位置开始向后查找字符 ch,找到则返回索引,否则返回 -1。 |
indexOf(String str, int fromIndex) |
int |
从 fromIndex 位置开始向后查找子字符串 str,找到则返回起始索引,否则返回 -1。 |
indexOf() 的核心:找到返回索引(0或正数),找不到返回 -1,这是进行字符串搜索和判断的基础。
