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. 使用技巧

  1. 存在性检查

    if (sb.indexOf("error") != -1) {
        System.err.println("Error detected!");
    }
    
  2. 循环查找所有匹配

    int index = -1;
    while ((index = sb.indexOf("Java", index + 1)) != -1) {
        System.out.println("Found at: " + index);
    }
    
  3. 组合操作(删除首个匹配项)

    int pos = sb.indexOf("bug");
    if (pos != -1) {
        sb.delete(pos, pos + 3); // 删除"bug"
    }
    

5. 常见错误与注意事项

  1. 空指针异常

    // 错误:str 为 null
    int index = sb.indexOf(null); // 抛出 NullPointerException
    
  2. 大小写敏感误解

    StringBuilder sb = new StringBuilder("JAVA");
    int index = sb.indexOf("java"); // 返回 -1,而非 0
    
  3. 起始索引包含性误解

    // 从索引 5 开始包含位置 5
    "ABCDE".indexOf("E", 4); // 返回 4,不是 -1
    

6. 最佳实践与性能优化

  1. 避免重复创建子串

    // ✅ 高效:复用子串对象
    String target = "important";
    int pos = sb.indexOf(target);
    
    // ❌ 低效:每次创建新对象
    int pos = sb.indexOf("important");
    
  2. 链式调用优化

    // 避免多次调用 indexOf()
    int start = sb.indexOf("{{");
    int end = sb.indexOf("}}", start);
    
  3. 大文本搜索优化

    // 当 fromIndex > length - str.length() 时提前终止
    if (fromIndex > sb.length() - target.length()) {
        return -1; // 自定义快速失败
    }
    

7. 总结

关键点 说明
核心作用 定位子串首次出现位置
返回值 找到返回索引 (≥0),未找到返回 -1
空串行为 任意位置匹配,返回 fromIndex 或 0
大小写敏感 区分大小写(可用 toString().toLowerCase() 预处理)
性能特点 时间复杂度 O(n*m),大文本需优化
线程安全 只读操作线程安全(但后续操作需同步)