
在 Java 中,从路径类字符串(如 /good/123/bad/456)中提取数字时,直接使用正则 Matcher 配合 Long.parseLong(CharSequence, int, int, int)(Java 9+)比 String.split() 或 Pattern.matcher().group() 更高效,可避免不必要的字符串拷贝和对象创建。
在 java 中,从路径类字符串(如 `/good/123/bad/456`)中提取数字时,直接使用正则 `matcher` 配合 `long.parselong(charsequence, int, int, int)`(java 9+)比 `string.split()` 或 `pattern.matcher().group()` 更高效,可避免不必要的字符串拷贝和对象创建。
当处理高频或性能敏感场景(如日志解析、路由匹配、协议解码)时,字符串提取的底层开销不容忽视。以字符串 "/good/312321312/bad/3213122131" 为例,目标是提取两个数字 312321312 和 3213122131。表面上看,split("/") 简洁直观:
String[] parts = s.split("/");
// 然后遍历 parts 找数字 → 低效:创建 5 个新 String 对象,含 "/good"、""、"312321312" 等
但 split() 内部会为每个分割片段调用 substring(),而 substring() 在 Java 9+ 虽已改为复制字符数组,但仍需分配新字符串对象并拷贝对应字节 —— 对仅需数值的场景属于冗余开销。
更优解是复用预编译的 Pattern,结合 Matcher 定位数字起止索引,并用 零拷贝解析 直接读取原始字符串片段:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
private static final Pattern DIGIT_PATTERN = Pattern.compile("\d+");
public static long[] extractNumbers(String s) {
Matcher m = DIGIT_PATTERN.matcher(s);
LongStream.Builder builder = LongStream.builder();
while (m.find()) {
// Java 9+ 新增重载:无需创建子串,直接解析 char 序列区间
long num = Long.parseLong(s, m.start(), m.end(), 10);
builder.add(num);
}
return builder.build().toArray();
}
✅ 关键优化点:
- ✅ 复用 static final Pattern:避免每次调用都重新编译正则,消除 String.split(String) 内部隐式 Pattern.compile() 的开销;
- ✅ 零字符串创建:Long.parseLong(CharSequence, int, int, int) 直接操作原字符串的逻辑区间,跳过 m.group() 生成临时 String;
- ✅ 减少 GC 压力:无中间 String 对象(尤其是非数字部分如 "good"、"bad" 完全不实例化);
- ✅ 可控性更强:Matcher.find() 支持按需提取前 N 个匹配项,适合“只取前两个数字”的明确需求。
⚠️ 注意事项:
- 此方案要求 JDK 9 或更高版本(Long.parseLong 的四参数重载自 Java 9 引入);
- 若需兼容 JDK 8,可退化为 Long.parseLong(m.group()),虽仍优于 split()(因只创建匹配数字的子串),但会多出少量字符串对象;
- 对超长字符串或海量调用场景,建议将 Matcher 实例缓存(通过 m.reset(s) 复用),进一步减少对象分配;
- 若数字语义固定(如始终是第 2 和第 4 个路径段),也可用 indexOf + substring 手动定位,但正则方案更具可维护性和健壮性(自动跳过非数字段)。
综上,在性能优先的工程实践中,正则匹配 + 区间解析是兼顾效率、可读与扩展性的最优选择;而 split() 应保留在逻辑简单、调用频次低、或需完整分段语义的场景中。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










