StringBuilder.indexOf()
是字符串搜索的核心方法,用于在 StringBuilder
中定位子串或字符的首次出现位置。不修改原对象,仅返回索引信息。
1. 方法定义
// 查找子串的首次出现位置(从头搜索)
public int indexOf(String str)
// 从指定索引开始查找子串
public int indexOf(String str, int fromIndex)
- 参数:
str
:要查找的子字符串(非 null)fromIndex
:起始搜索位置(包含)
- 返回值:
- 找到时:返回子串首字符的索引
- 未找到:返回
-1
- 异常:
NullPointerException
(当str
为 null 时)
2. 功能说明
场景 | 返回值示例 | 说明 |
---|---|---|
子串存在 | sb.indexOf("cat") → 3 |
返回首次出现的起始索引 |
子串不存在 | sb.indexOf("dog") → -1 |
固定返回 -1 |
空字符串 "" |
sb.indexOf("") → 0 |
任意位置都匹配空串 |
fromIndex 越界 |
sb.indexOf("a", 100) → -1 |
起始位置 ≥ length 时返回 -1 |
大小写敏感 | sb.indexOf("A") ≠ "a" |
区分大小写 |
3. 示例代码
public class IndexOfExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Java is fun. Java is powerful.");
// 基础查找
int firstJava = sb.indexOf("Java"); // 0
int secondJava = sb.indexOf("Java", 1); // 13
// 空字符串处理
int emptyStrIndex = sb.indexOf(""); // 0
// 不存在的子串
int notFound = sb.indexOf("Python"); // -1
System.out.println("First 'Java': " + firstJava);
System.out.println("Second 'Java': " + secondJava);
}
}
4. 使用技巧
存在性检查:
if (sb.indexOf("error") != -1) { System.err.println("Error detected!"); }
循环查找所有匹配:
int index = -1; while ((index = sb.indexOf("Java", index + 1)) != -1) { System.out.println("Found at: " + index); }
组合操作(删除首个匹配项):
int pos = sb.indexOf("bug"); if (pos != -1) { sb.delete(pos, pos + 3); // 删除"bug" }
5. 常见错误与注意事项
空指针异常:
// 错误:str 为 null int index = sb.indexOf(null); // 抛出 NullPointerException
大小写敏感误解:
StringBuilder sb = new StringBuilder("JAVA"); int index = sb.indexOf("java"); // 返回 -1,而非 0
起始索引包含性误解:
// 从索引 5 开始包含位置 5 "ABCDE".indexOf("E", 4); // 返回 4,不是 -1
6. 最佳实践与性能优化
避免重复创建子串:
// ✅ 高效:复用子串对象 String target = "important"; int pos = sb.indexOf(target); // ❌ 低效:每次创建新对象 int pos = sb.indexOf("important");
链式调用优化:
// 避免多次调用 indexOf() int start = sb.indexOf("{{"); int end = sb.indexOf("}}", start);
大文本搜索优化:
// 当 fromIndex > length - str.length() 时提前终止 if (fromIndex > sb.length() - target.length()) { return -1; // 自定义快速失败 }
7. 总结
关键点 | 说明 |
---|---|
核心作用 | 定位子串首次出现位置 |
返回值 | 找到返回索引 (≥0),未找到返回 -1 |
空串行为 | 任意位置匹配,返回 fromIndex 或 0 |
大小写敏感 | 区分大小写(可用 toString().toLowerCase() 预处理) |
性能特点 | 时间复杂度 O(n*m),大文本需优化 |
线程安全 | 只读操作线程安全(但后续操作需同步) |