如何高效利用 String.regionMatches() 进行局部字符串匹配以实现模糊搜索?
- 内容介绍
- 相关推荐
本文共计1180个文字,预计阅读时间需要5分钟。
由于+regionMatches+不创建新的字符串对象,直接在原+String+的底层+char[](或+byte[],Java 9+)上进行逐字符比较,避免了内存分配和复制开销。而在Java 8及之前,+substring+会共享原字符串的数字数组(看似轻量),但Java 9+改为必须复制,随后再调用+equals+,还需额外遍历——两步变三步,GC压力和CPU时间都更高。
实操建议:
- 只要目标是「检查某段是否等于某固定短串」,优先用
regionMatches(),别先切再比 - 注意:
regionMatches()的起始索引和长度必须落在源字符串有效范围内,否则抛StringIndexOutOfBoundsException,需提前校验 - 若需忽略大小写,用带
ignoreCase参数的重载(boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)),它内部用Character.toLowerCase()逐字符比对,比先转小写再比更省内存
如何安全传参:toffset、ooffset、len 三者关系怎么算
这是最常出错的地方:三个参数不是“任意填”,而是强约束的。
本文共计1180个文字,预计阅读时间需要5分钟。
由于+regionMatches+不创建新的字符串对象,直接在原+String+的底层+char[](或+byte[],Java 9+)上进行逐字符比较,避免了内存分配和复制开销。而在Java 8及之前,+substring+会共享原字符串的数字数组(看似轻量),但Java 9+改为必须复制,随后再调用+equals+,还需额外遍历——两步变三步,GC压力和CPU时间都更高。
实操建议:
- 只要目标是「检查某段是否等于某固定短串」,优先用
regionMatches(),别先切再比 - 注意:
regionMatches()的起始索引和长度必须落在源字符串有效范围内,否则抛StringIndexOutOfBoundsException,需提前校验 - 若需忽略大小写,用带
ignoreCase参数的重载(boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)),它内部用Character.toLowerCase()逐字符比对,比先转小写再比更省内存
如何安全传参:toffset、ooffset、len 三者关系怎么算
这是最常出错的地方:三个参数不是“任意填”,而是强约束的。

