indexOf是Java String类中用于查找子串首次出现位置的高效方法,返回起始索引(从0开始),未找到返回-1;支持重载指定起始位置、处理空字符串(返回0)、区分大小写、兼容Unicode;底层为优化的native实现,无内存分配,但不支持正则或模糊匹配。

indexOf 是 Java 中 String 类最常用、最高效的子串查找方法之一,它基于优化的字符逐个比较(非 KMP 等复杂算法),在绝大多数实际场景下性能足够且语义清晰。
基础用法:定位首次出现位置
调用 str.indexOf(sub) 返回子字符串 sub 在 str 中**首次出现的起始索引**(从 0 开始);未找到则返回 -1。
- 空字符串
""作为参数时,始终返回0(JDK 规范定义) - 区分大小写,例如
"Hello".indexOf("h")返回-1 - 支持 Unicode,对中文、emoji 等正常工作(基于 UTF-16 编码单位,常规字符无问题)
进阶技巧:从指定位置开始搜索
使用 str.indexOf(sub, fromIndex) 可跳过前缀,避免重复扫描,适合多次查找或分段处理:
-
fromIndex为起始搜索下标(含),必须 ≥ 0;若超出字符串长度,直接返回-1 - 查找所有匹配位置示例:
int idx = -1;
while ((idx = str.indexOf("ab", idx + 1)) != -1) {
System.out.println("found at " + idx);
}
性能关键点:为什么它够快?
indexOf 底层是高度优化的 native 实现(HotSpot 中常内联为汇编级循环),比手写 for-loop 更可靠:
立即学习“Java免费学习笔记(深入)”;
- 自动处理边界检查与空值安全(传入 null 会抛
NullPointerException,需自行判空) - 对短子串(≤ 4 字符)有特殊快速路径,避免函数调用开销
- 不创建新对象,无额外内存分配,适合高频调用场景(如日志解析、协议解包)
注意避坑:常见误用
别把 indexOf 当正则用,也别混淆返回值含义:
- 返回
0表示子串出现在开头,不是“没找到”——务必用== -1判断失败 - 不支持通配符或模糊匹配;需要模式匹配请用
Pattern,但代价高得多 - 若需忽略大小写,先转统一大小写再查(
str.toLowerCase().indexOf(sub.toLowerCase())),注意 locale 敏感性


















