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

核心概念
indexOf 方法返回一个整数值,这个值代表了匹配项的起始索引(index),在 Java 中,字符串的索引从 0 开始。
- 如果找到匹配项:返回该字符或子字符串第一次出现位置的索引。
- 如果未找到匹配项:返回 -1。
方法重载
String 类提供了多个重载的 indexOf 方法,以适应不同的查找需求,主要分为两大类:查找字符 和 查找子字符串。
A. 查找字符
-
indexOf(int ch)- 功能:查找指定字符
ch在字符串中第一次出现的位置。 - 参数:
ch是一个int类型,表示一个 Unicode 字符,当你传入一个char类型的值时,它会自动提升为int。 - 返回值:字符的索引,如果未找到则返回
-1。
String str = "Hello, World!"; int index = str.indexOf('W'); // 查找字符 'W' System.out.println(index); // 输出: 7 int indexNotFound = str.indexOf('z'); System.out.println(indexNotFound); // 输出: -1 - 功能:查找指定字符
-
indexOf(int ch, int fromIndex)
(图片来源网络,侵删)- 功能:从指定的起始位置
fromIndex开始,向后查找字符ch第一次出现的位置。 - 参数:
ch:要查找的字符。fromIndex:开始查找的索引位置。fromIndex为负数,则从 0 开始查找。fromIndex大于等于字符串长度,则直接返回 -1。
- 返回值:字符的索引,如果未找到则返回
-1。
String str = "Hello, World, Hello Java"; // 从索引 8 的位置开始查找 'l' int index = str.indexOf('l', 8); System.out.println(index); // 输出: 10 (找到的是 "World" 后面的 'l') // 从索引 20 的位置开始查找 'l' int indexNotFound = str.indexOf('l', 20); System.out.println(indexNotFound); // 输出: -1 (从20开始后面没有'l'了) - 功能:从指定的起始位置
B. 查找子字符串
-
indexOf(String str)- 功能:查找指定的子字符串
str在当前字符串中第一次出现的位置。 - 参数:
str是要查找的子字符串。 - 返回值:子字符串的起始索引,如果未找到则返回
-1。
String sentence = "I love Java, and I love programming."; String wordToFind = "love"; int index = sentence.indexOf(wordToFind); System.out.println(index); // 输出: 2 String notFound = sentence.indexOf("Python"); System.out.println(notFound); // 输出: -1 - 功能:查找指定的子字符串
-
indexOf(String str, int fromIndex)- 功能:从指定的起始位置
fromIndex开始,向后查找子字符串str第一次出现的位置。 - 参数:
str:要查找的子字符串。fromIndex:开始查找的索引位置。
- 返回值:子字符串的起始索引,如果未找到则返回
-1。
String sentence = "I love Java, and I love programming."; // 从索引 10 的位置开始查找 "love" int index = sentence.indexOf("love", 10); System.out.println(index); // 输出: 18 (找到的是第二个 "love") - 功能:从指定的起始位置
常见使用场景
场景1:检查字符串中是否包含某个子串
这是 indexOf 最常见的用途,通过判断返回值是否为 -1 来确定是否存在。
public boolean containsWord(String text, String word) {
// indexOf 返回的不是 -1,说明找到了
return text.indexOf(word) != -1;
}
// 使用示例
String text = "This is a test sentence.";
System.out.println(containsWord(text, "test")); // 输出: true
System.out.println(containsWord(text, "example")); // 输出: false
场景2:查找所有匹配项的位置
indexOf 只能找第一个,如果要找所有,需要在一个循环中反复调用它,并更新 fromIndex 参数。

String text = "abababab";
String subStr = "ab";
int index = text.indexOf(subStr); // 第一次查找,从 0 开始
while (index != -1) {
System.out.println("找到 'ab' 在索引: " + index);
// 从找到位置的下一个字符开始,继续查找
index = text.indexOf(subStr, index + 1);
}
// 输出:
// 找到 'ab' 在索引: 0
// 找到 'ab' 在索引: 2
// 找到 'ab' 在索引: 4
// 找到 'ab' 在索引: 6
场景3:提取子字符串
结合 substring 方法,可以非常方便地截取字符串。
String url = "https://www.example.com/path/to/resource.html";
int protocolEndIndex = url.indexOf("://");
if (protocolEndIndex != -1) {
String domain = url.substring(protocolEndIndex + 3); // +3 是为了跳过 "://"
System.out.println("域名是: " + domain); // 输出: 域名是: www.example.com/path/to/resource.html
}
重要注意事项
-
大小写敏感:
indexOf是大小写敏感的。"Java".indexOf("java")会返回-1。System.out.println("Java".indexOf("java")); // 输出: -1 -
参数
fromIndex的范围:fromIndex是负数,它会被当作0处理。fromIndex大于或等于字符串的长度,方法会直接返回-1,因为不可能在字符串之外找到内容。
-
查找空字符串 :
indexOf("")总是返回0,因为空字符串可以被认为存在于任何位置,尤其是在字符串的开头。indexOf("", 5)如果字符串长度大于等于5,则返回5;否则返回字符串长度。
-
性能考虑:
indexOf的时间复杂度通常是 *O(n m)**,n是主字符串的长度,m是要查找的字符或子串的长度,在最坏的情况下(查找一个很长的子串),它可能需要遍历整个主字符串。- 对于大量、频繁的查找操作,可以考虑使用更高效的数据结构,如
HashMap来预先存储和查找。
与 lastIndexOf 的区别
String 类还提供了 lastIndexOf 方法,它与 indexOf 的行为正好相反。
| 方法 | 功能 | 返回值 |
|---|---|---|
indexOf() |
查找第一次出现的位置 | 第一个匹配项的索引 |
lastIndexOf() |
查找最后一次出现的位置 | 最后一个匹配项的索引 |
String str = "hello world, hello java";
System.out.println(str.indexOf("hello")); // 输出: 0
System.out.println(str.lastIndexOf("hello")); // 输出: 13
| 方法签名 | 描述 |
|---|---|
indexOf(int ch) |
查找字符 ch 第一次出现的索引。 |
indexOf(int ch, int fromIndex) |
从 fromIndex 开始,查找字符 ch 第一次出现的索引。 |
indexOf(String str) |
查找子字符串 str 第一次出现的索引。 |
indexOf(String str, int fromIndex) |
从 fromIndex 开始,查找子字符串 str 第一次出现的索引。 |
返回 -1 表示“未找到”,这是判断是否存在某个子串的关键。indexOf 是 Java 字符串处理中一个非常基础且重要的工具。
