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

indexOf 方法有四种主要的重载形式,我们逐一进行讲解。
核心概念
- 返回值:
indexOf方法总是返回一个int类型的值。- 如果找到匹配项,返回其首次出现的索引(index),索引从
0开始。 - 如果没有找到匹配项,返回
-1。
- 如果找到匹配项,返回其首次出现的索引(index),索引从
- 索引:字符串中每个字符都有一个位置,从
0开始,依次递增,在字符串"Hello"中,'H'的索引是0,'e'的索引是1,依此类推。
方法 1:查找单个字符(从开头查找)
这是最基本的形式,用于查找一个字符在字符串中第一次出现的位置。
语法
public int indexOf(int ch)
ch:要查找的字符,在 Java 中,char类型可以自动提升为int,所以这里可以直接传入一个字符。
示例代码
public class IndexOfExample {
public static void main(String[] args) {
String str = "Hello, World! Welcome to Java.";
// 查找字符 'W' 的位置
int indexW = str.indexOf('W');
System.out.println("字符 'W' 的索引是: " + indexW); // 输出: 7
// 查找字符 'o' 的位置
int indexO = str.indexOf('o');
System.out.println("字符 'o' 的索引是: " + indexO); // 输出: 4
// 查找一个不存在的字符 'z'
int indexZ = str.indexOf('z');
System.out.println("字符 'z' 的索引是: " + indexZ); // 输出: -1
}
}
方法 2:查找单个字符(从指定位置开始查找)
如果你想在字符串的某个特定位置之后开始查找,可以使用这个方法。
语法
public int indexOf(int ch, int fromIndex)
ch:要查找的字符。fromIndex:开始查找的起始索引(包括这个索引本身)。
示例代码
public class IndexOfFromIndexExample {
public static void main(String[] args) {
String str = "Hello, Hello, World!";
// 从索引 0 开始查找 'l',结果为 2
int firstL = str.indexOf('l');
System.out.println("从开头查找 'l': " + firstL); // 输出: 2
// 从索引 3 开始查找 'l',会从 "lo, Hello..." 开始找,结果为 3
int secondL = str.indexOf('l', 3);
System.out.println("从索引 3 开始查找 'l': " + secondL); // 输出: 3
// 从索引 5 开始查找 'l',会从 ", Hello..." 开始找,结果为 9
int thirdL = str.indexOf('l', 5);
System.out.println("从索引 5 开始查找 'l': " + thirdL); // 输出: 9
// fromIndex 可以大于字符串长度,此时返回 -1
int notFound = str.indexOf('l', str.length());
System.out.println("从字符串长度之后查找: " + notFound); // 输出: -1
}
}
方法 3:查找子字符串(从开头查找)
这是另一种非常常用的形式,用于查找一个子字符串(一串字符)在当前字符串中首次出现的位置。

语法
public int indexOf(String str)
str:要查找的子字符串。
示例代码
public class IndexOfStringExample {
public static void main(String[] args) {
String sentence = "I am learning Java programming.";
// 查找子字符串 "Java"
int indexJava = sentence.indexOf("Java");
System.out.println("子字符串 \"Java\" 的索引是: " + indexJava); // 输出: 13
// 查找子字符串 "java" (注意大小写)
int indexjava = sentence.indexOf("java");
System.out.println("子字符串 \"java\" 的索引是: " + indexjava); // 输出: -1 (因为大小写不匹配)
// 查找不存在的子字符串 "Python"
int indexPython = sentence.indexOf("Python");
System.out.println("子字符串 \"Python\" 的索引是: " + indexPython); // 输出: -1
}
}
方法 4:查找子字符串(从指定位置开始查找)
结合方法 2 和方法 3,这个方法允许你从指定的索引位置开始,查找一个子字符串。
语法
public int indexOf(String str, int fromIndex)
str:要查找的子字符串。fromIndex:开始查找的起始索引。
示例代码
public class IndexOfStringFromIndexExample {
public static void main(String[] args) {
String str = "This is a test. This is only a test.";
// 查找子字符串 "This" 的位置
int firstThis = str.indexOf("This");
System.out.println("第一个 \"This\" 的索引是: " + firstThis); // 输出: 0
// 从索引 5 开始查找 "This",会跳过第一个 "This"
int secondThis = str.indexOf("This", 5);
System.out.println("第二个 \"This\" 的索引是: " + secondThis); // 输出: 21
}
}
重要注意事项和最佳实践
区分大小写
indexOf 方法是区分大小写的。"Java" 和 "java" 会被视为两个不同的字符串。
String s = "Java";
System.out.println(s.indexOf("Ja")); // 输出: 0
System.out.println(s.indexOf("ja")); // 输出: -1
处理返回值 -1
在使用 indexOf 之后,一定要检查返回值是否为 -1,以避免潜在的逻辑错误,直接使用返回值进行计算可能会导致 ArrayIndexOutOfBoundsException 或其他问题。
错误示例:
String text = "Hello World";
char c = text.indexOf('x'); // 假设 'x' 不存在
// ... 后续代码如果错误地使用了 c ...
正确示例:
String text = "Hello World";
int index = text.indexOf('x');
if (index != -1) {
// 找到了,可以安全地使用 index
System.out.println("找到了字符,索引是: " + index);
} else {
// 没找到,进行相应处理
System.out.println("字符串中不包含字符 'x'");
}
fromIndex 的范围
fromIndex为负数,其行为等同于0,即从字符串开头查找。fromIndex大于或等于字符串的长度,方法将直接返回-1,因为不可能在超出字符串范围的位置找到内容。
与 lastIndexOf 的区别
String 类还提供了 lastIndexOf 方法,它与 indexOf 功能相反,用于查找字符或子字符串最后一次出现的位置。
String str = "banana";
int firstA = str.indexOf('a'); // 输出: 1
int lastA = str.lastIndexOf('a'); // 输出: 5
综合应用场景
场景:从一个 URL 中提取文件名
假设有一个 URL 字符串,我们想从中提取出文件名部分(例如从 "http://example.com/images/pic.jpg" 中提取 "pic.jpg")。
public class UrlParser {
public static void main(String[] args) {
String url = "http://example.com/images/pic.jpg";
// 1. 找到最后一个 '/' 的位置
int lastSlashIndex = url.lastIndexOf('/');
System.out.println("最后一个 '/' 的索引是: " + lastSlashIndex); // 输出: 24
// 2. 从最后一个 '/' 的下一个位置开始截取字符串,直到末尾
if (lastSlashIndex != -1) {
String fileName = url.substring(lastSlashIndex + 1);
System.out.println("提取的文件名是: " + fileName); // 输出: pic.jpg
} else {
System.out.println("URL 中不包含 '/',无法提取文件名。");
}
}
}
这个例子完美地结合了 lastIndexOf 和 substring 方法,是 indexOf 系列方法的一个典型应用。
| 方法签名 | 功能描述 | 示例 |
|---|---|---|
indexOf(int ch) |
查找字符 ch首次出现的索引。 |
"abc".indexOf('b') -> 1 |
indexOf(int ch, int fromIndex) |
从 fromIndex 开始,查找字符 ch首次出现的索引。 |
"abbc".indexOf('b', 2) -> 2 |
indexOf(String str) |
查找子字符串 str首次出现的索引。 |
"abcde".indexOf("cd") -> 2 |
indexOf(String str, int fromIndex) |
从 fromIndex 开始,查找子字符串 str首次出现的索引。 |
"ababc".indexOf("ab", 1) -> 2 |
indexOf 的核心思想是“查找首次出现的位置”,并始终记得处理返回值为 -1 的情况,你就能在 Java 编程中熟练运用它了。
