推荐使用 String.contains() 判断子串存在性,语义清晰、性能好且支持任意 CharSequence;需注意 null 检查和大小写敏感问题,若需定位位置则改用 indexOf()。

最常用且高效的方式是直接用 String.contains(),它语义清晰、调用简洁,底层就是基于 indexOf() 实现,性能与手动调用 indexOf() != -1 几乎一致。
推荐用 contains() —— 简洁又安全
这是专为“存在性判断”设计的方法,代码可读性强:
- 传入任意
CharSequence(如String、StringBuilder)即可 - 返回
true表示子串至少出现一次,否则false - 空字符串
""恒为true(符合语义:“任何非 null 字符串都包含空串”)
注意 null 和大小写
contains() 不接受 null 参数,否则抛 NullPointerException;同时默认区分大小写:
- 安全写法:先判空再调用,例如
s != null && s.contains("abc") - 忽略大小写时,不要用正则(如
matches("(?i).*abc.*")),开销大;推荐转小写:s != null && s.toLowerCase().contains("abc")
何时改用 indexOf()?
如果后续还需知道子串位置(比如截取、替换、高亮),直接用 indexOf() 更合适:
立即学习“Java免费学习笔记(深入)”;
- 返回首次匹配索引(
-1表示未找到) - 一次调用,既能判断又能定位,避免重复查找
- 例如:
int pos = s.indexOf("target"); if (pos != -1) { /* 使用 pos 做后续操作 */ }
不建议的替代方案
以下方法要么不标准、要么低效或易出错:
-
matches()或Pattern:用于正则匹配,做简单子串判断是杀鸡用牛刀,性能差且易写错模式 -
startsWith()/endsWith():只适用于前缀/后缀场景,语义不匹配 -
regionMatches():适合局部比对且需控制忽略大小写,但普通包含判断没必要绕弯


















