indexOf 方法的返回值是一个 整数,它表示子字符串或字符在原字符串中首次出现的位置(索引)。

- 成功找到:返回从
0开始的索引值。 - 未找到:返回一个固定的特殊值
-1。
返回值的两种情况
找到子字符串或字符
当 indexOf 在字符串中成功找到了目标子串或字符时,它会返回该目标首次出现的字符的索引,这个索引是从 0 开始计算的。
示例:
String str = "Hello, World!";
// 查找字符 'W'
int index1 = str.indexOf('W');
System.out.println("字符 'W' 的索引是: " + index1); // 输出: 字符 'W' 的索引是: 7
// 查找子字符串 "World"
int index2 = str.indexOf("World");
System.out.println("子字符串 \"World\" 的索引是: " + index2); // 输出: 子字符串 "World" 的索引是: 7
解释:
在字符串 "Hello, World!" 中:
'H'的索引是0'e'的索引是1'W'的索引是7
indexOf('W') 和 indexOf("World") 都返回 7。

未找到子字符串或字符
当 indexOf 在整个字符串中都没有找到目标子串或字符时,它会返回 -1,这是一个非常重要的约定,在编程中经常被用来判断某个元素是否存在。
示例:
String str = "Hello, World!";
// 查找不存在的字符 'z'
int index1 = str.indexOf('z');
System.out.println("字符 'z' 的索引是: " + index1); // 输出: 字符 'z' 的索引是: -1
// 查找不存在的子字符串 "Java"
int index2 = str.indexOf("Java");
System.out.println("子字符串 \"Java\" 的索引是: " + index2); // 输出: 子字符串 "Java" 的索引是: -1
indexOf 的常用重载方法
String 类中提供了多个重载的 indexOf 方法,它们有不同的参数,但返回值的核心逻辑是一致的。
a. indexOf(int ch)
查找指定字符(ch)第一次出现的位置。
- 参数:一个字符(
char),但以int类型传入,因为char在 Java 中是int的子集。 - 返回值:字符的索引,或
-1。
String str = "banana";
int index = str.indexOf('a'); // 'a' 首次出现在索引 1
System.out.println(index); // 输出: 1
b. indexOf(int ch, int fromIndex)
从指定的索引(fromIndex)之后开始,查找字符 ch 第一次出现的位置。
- 参数:
ch: 要查找的字符。fromIndex: 开始查找的起始索引(包含此索引)。
- 返回值:字符的索引,或
-1。
String str = "banana";
// 从索引 2 开始查找 'a',所以会找到索引 3 的 'a'
int index = str.indexOf('a', 2);
System.out.println(index); // 输出: 3
c. indexOf(String str)
查找指定子字符串(str)第一次出现的位置。
- 参数:一个子字符串。
- 返回值:子字符串首字符的索引,或
-1。
String str = "Hello Java, Hello World";
int index = str.indexOf("Java");
System.out.println(index); // 输出: 6
d. indexOf(String str, int fromIndex)
从指定的索引(fromIndex)之后开始,查找子字符串 str 第一次出现的位置。
- 参数:
str: 要查找的子字符串。fromIndex: 开始查找的起始索引(包含此索引)。
- 返回值:子字符串首字符的索引,或
-1。
String str = "Hello Java, Hello World";
// 从索引 10 开始查找 "Hello",所以会找到第二个 "Hello"
int index = str.indexOf("Hello", 10);
System.out.println(index); // 输出: 13
实际应用场景:检查子字符串是否存在
这是 indexOf 最常见的用法之一,通过判断返回值是否为 -1,可以高效地确定一个字符串是否包含另一个字符串。
public class IndexOfExample {
public static void main(String[] args) {
String url = "https://www.example.com";
String protocol = "https://";
String invalidProtocol = "ftp://";
// 检查是否使用 HTTPS 协议
if (url.indexOf(protocol) != -1) {
System.out.println("该 URL 使用的是 HTTPS 协议。");
} else {
System.out.println("该 URL 不使用 HTTPS 协议。");
}
// 检查是否包含无效协议
if (url.indexOf(invalidProtocol) == -1) {
System.out.println("该 URL 不包含无效的 FTP 协议。");
}
}
}
输出:
该 URL 使用的是 HTTPS 协议。
该 URL 不包含无效的 FTP 协议。
与 lastIndexOf 的对比
Java 还提供了 lastIndexOf 方法,它的作用与 indexOf 相反。
indexOf:返回第一次出现的位置。lastIndexOf:返回最后一次出现的位置。
它们的返回值规则相同:找到则返回索引(从0开始),找不到则返回 -1。
示例:
String str = "abracadabra";
// 第一次出现 'a' 的位置
int firstIndex = str.indexOf('a');
System.out.println("第一次出现 'a' 的索引: " + firstIndex); // 输出: 0
// 最后一次出现 'a' 的位置
int lastIndex = str.lastIndexOf('a');
System.out.println("最后一次出现 'a' 的索引: " + lastIndex); // 输出: 10
// 查找不存在的字符
System.out.println("indexOf('z'): " + str.indexOf('z')); // 输出: -1
System.out.println("lastIndexOf('z'): " + str.lastIndexOf('z')); // 输出: -1
总结表格
| 方法 | 描述 | 返回值(找到) | 返回值(未找到) |
|---|---|---|---|
indexOf(int ch) |
查找字符首次出现的位置 | 字符的索引 (>= 0) | -1 |
indexOf(int ch, int fromIndex) |
从指定位置之后查找字符首次出现的位置 | 字符的索引 (>= 0) | -1 |
indexOf(String str) |
查找子字符串首次出现的位置 | 子串首字符的索引 (>= 0) | -1 |
indexOf(String str, int fromIndex) |
从指定位置之后查找子字符串首次出现的位置 | 子串首字符的索引 (>= 0) | -1 |
lastIndexOf(...) |
查找字符/子字符串最后一次出现的位置 | 字符/子串首字符的索引 (>= 0) | -1 |
记住这个核心原则:indexOf 返回的是索引,找不到就返回 -1,这是理解和使用该方法的关键。
