String.strip()比trim()更先进,它基于Unicode标准移除所有空白字符(如全角空格、零宽空格、段落分隔符等),而trim()仅处理ASCII范围内的空白;strip()语义准确、国际化,适合现代多语言场景。

String.trim() 只移除 ASCII 范围内的空白字符(U+0000 到 U+0020),包括空格、制表符 \t、换行符 \n、回车符 \r 等;而 String.strip()(Java 11+)基于 Unicode 标准,能识别并移除所有被 Character.isWhitespace(int) 判定为“空白”的字符,覆盖更广(如全角空格、零宽空格、段落分隔符等)。
trim() 的实际行为与局限
它通过遍历字符串首尾,检查每个字符是否 ≤ U+0020(即 c )。只要字符码点在 0x0000–0x0020 区间内,就被视为可裁剪的空白。
- 能处理:
" hello "→"hello","\t\n\r hello \f\v"→"hello"(注意:\f和\v的码点分别是 0x000C 和 0x000B,在范围内) - 不能处理:
" hello "(全角空格 U+3000)、"hello"(零宽空格 U+200B)、"\u2029hello\u2029"(段落分隔符)——这些均 > U+0020,trim() 视而不见
strip() 的语义更准确且国际化
它调用 Character.isWhitespace(int) 判断每个首尾字符。该方法依据 Unicode 13.0+ 定义的“Whitespace Character”列表,涵盖:
- 传统控制符(
\t,\n,\r,\f,\u000B等) - Unicode 分隔符:如
\u2000–\u200A(各种空格)、\u2028(行分隔符)、\u2029(段落分隔符)、\u3000(全角空格) - 部分格式控制字符(如
\u200B零宽空格)
因此 " hello ".strip() → "hello","\u2029hello\u2029".strip() → "hello",而 trim() 对它们完全无效。
立即学习“Java免费学习笔记(深入)”;
底层实现关键差异
两者都返回新字符串(原串不变),但判断逻辑不同:
-
trim():纯数值比较,高效但语义窄。源码本质是while (start < len && value[start] <= ' ') start++; -
strip():委托Character.isWhitespace(),后者查表 + 条件分支,支持 Unicode 属性,开销略高但语义完备。内部会解析字符的 Unicode 类别(如SPACE_SEPARATOR、LINE_SEPARATOR等) - 二者都不修改原字符串,也不做 null 检查——传入 null 会直接抛
NullPointerException
选哪个?看场景
- 仅处理 ASCII 文本、性能极度敏感(如高频日志清洗)、且确认无 Unicode 空白 → 用
trim() - 处理用户输入、多语言文本、Web 内容、JSON/XML 值、或需符合 Unicode 规范 → 必须用
strip() - Java 8 项目无法用
strip()?可用Apache Commons Lang的StringUtils.strip()或手动遍历 +Character.isWhitespace()替代
不复杂但容易忽略:trim 是历史兼容性设计,strip 才是现代文本处理的合理默认。


















