String.regionMatches(true, toffset, other, ooffset, len)可高效安全地忽略大小写比较子串,不创建新字符串,自动校验越界但要求other非null,相比toLowerCase()更符合Unicode规范且性能更优。

String.regionMatches() 提供了高效、安全的局部字符串比较能力,其中忽略大小写的匹配可通过其重载方法直接实现,无需额外转为大写或小写,避免创建新字符串对象,适合对性能或内存敏感的场景。
使用带 ignoreCase 参数的 regionMatches 重载方法
Java 中最直接的方式是调用以下签名的方法:
public boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)参数说明:
-
ignoreCase:设为
true即启用忽略大小写的比较 - toffset:当前字符串中开始比较的起始索引(从 0 开始)
- other:待比较的目标字符串
- ooffset:目标字符串中开始比较的起始索引
- len:要比较的字符数量(长度)
示例:
String text = "Hello World";boolean matches = text.regionMatches(true, 0, "HELLO", 0, 5); // true
注意边界与空值安全
该方法内部会自动校验索引范围和长度是否越界,若任一范围超出字符串实际长度,直接返回 false,无需手动判断。但传入的 other 字符串不能为 null,否则抛出 NullPointerException。
安全写法建议:
- 提前判空:
if (other == null) return false; - 确保
len ≥ 0,且toffset + len ≤ text.length()和ooffset + len ≤ other.length()—— 虽然方法内部已检查,但显式校验有助于提前失败或日志追踪
与 toLowerCase().substring().equals() 的关键区别
常见替代写法如 text.substring(...).toLowerCase().equals(other.toLowerCase()) 存在明显缺陷:
- 创建多个中间字符串对象,增加 GC 压力
- 对非 ASCII 字符(如带重音符号的字母、德语 ß、土耳其语 İ)的大小写转换行为不一致,可能误判
-
regionMatches(true, ...)底层使用Character.toUpperCase()/toLowerCase()的语义化比较,更符合 Unicode 规范
结合区域匹配做子串关键词提取或协议解析
适用于轻量级协议头识别、日志行关键字定位等场景。例如判断某行是否以忽略大小写的 "GET " 开头(HTTP 方法):
String line = "get /index.html HTTP/1.1";if (line.regionMatches(true, 0, "GET ", 0, 4)) { /* 处理 GET 请求 */ }
注意此处长度写 4(G-E-T-空格),而非 3,避免将 "GETTING" 误判为合法方法。

















