stripLeading()和stripTrailing()仅处理Character.isWhitespace()为true的字符,不包括全角空格、零宽字符、BOM等;Java 8及更早版本不支持,需Java 11+;trim()范围窄但性能更好。

stripLeading() 和 stripTrailing() 去不干净?先确认你用的是 Java 11+
这两个方法在 Java 8 及更早版本根本不存在,直接编译报错 cannot find symbol。Java 11 才正式引入,且它们只处理 Unicode 定义的“空白字符”(Character.isWhitespace() 返回 true 的字符),不包括某些看起来像空格但被归类为控制符或分隔符的字符(比如 'u2000' 至 'u200A' 中的部分字形空格)。如果你发现 " hello ".stripLeading()(全角空格)没反应,不是 bug,是设计如此——全角空格不属于 isWhitespace() 范畴。
哪些字符算“空白符”?别靠肉眼猜
stripLeading() 和 stripTrailing() 实际依赖 Character.isWhitespace(int) 判断,涵盖以下几类:
- ASCII 空格、制表符(
' ')、换行(' ')、回车(' ')、换页('') - Unicode 分隔符中的“空白分隔符”(
SPACE_SEPARATOR),如不换行空格'u00A0'、中英文间常用空格'u2000'–'u200B'中的部分(但注意:'u200B'是零宽空格,isWhitespace()返回 false,所以不会被 strip) - 部分控制字符,如
'u0085'(下一行符)
验证方式很简单:
System.out.println(Character.isWhitespace('u2000')); // true<br>System.out.println(Character.isWhitespace('u200B')); // false不确定某个字符是否会被处理?先用这行代码测。
想删全角空格、零宽字符、BOM?得手动处理
如果业务里常见 'u3000'(中文全角空格)、'uFEFF'(BOM)、'u200B'(零宽空格),stripLeading() 完全无效。这时必须自己定义规则:
AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。
- 用正则:例如
str.replaceAll("^[\u3000\uFEFF\u200B\s]+", "")(注意\s已包含isWhitespace()覆盖的字符,避免重复) - 用
codePoints()流式过滤:String cleaned = str.codePoints()<br> .dropWhile(cp -> cp == 'u3000' || cp == 'uFEFF' || Character.isWhitespace(cp))<br> .mapToObj(Character::toString)<br> .collect(Collectors.joining());
这个写法可精确控制首部逻辑,但性能略低于内置 strip - 若只需处理 BOM,推荐 Apache Commons Lang 的
StringUtils.stripStart(str, "uFEFF"),更直观
stripLeading() vs trim():性能和语义差异不能忽略
trim() 是老方法,它只删 ASCII 空格(U+0020)和控制符(' ', '
', '
', '', 'u000B'),范围窄但 JVM 优化极好;stripLeading() 范围广,但底层要遍历每个 code point 并调用 isWhitespace(),实测在长字符串上慢 2–3 倍。如果你确定输入只含 ASCII 空格和换行,trim() 仍是更稳更快的选择。
另外,stripLeading() 不会修改中间空格,这点和 trim() 一致;但它对 null 输入抛 NullPointerException,而 trim() 同样如此——别指望它做 null 安全处理。
真正容易被忽略的是:这些方法都返回新字符串,原字符串不变;且它们对空字符串、纯空白字符串均返回空字符串,行为一致,无需额外判空。

















