"strip()是Unicode感知的trim()升级版"这句话没错,但这篇真实测试发现它不是万能的——有一种常见的空白字符,strip()和老旧的trim()真实表现得一样无力。
trim()是Java最早期就有的老方法,strip()是Java11引入的升级版——用全角空格 包裹一段字符串,对比两者的真实处理结果。
StringStripVsTrimDemo.java String s1 = " hello "; // 全角空格包裹 s1.trim(); s1.strip();
s1.trim() 真实结果长度: 7(原长度7,trim真实没有去掉全角空格) s1.strip() 真实结果长度: 5(strip真实识别Unicode空白,去掉了全角空格)
真实结果印证了两者判定标准的根本差异:trim() 是 Java 1.0 时代就存在的方法,它的判定规则极其简单粗暴——只要字符的数值 <= 0x20(也就是ASCII控制字符和普通空格)就认为是"空白"要去掉;而 strip() 内部真实基于 Character.isWhitespace() 这个更完整的 Unicode 感知判定,能识别包括全角空格在内的多种 Unicode 空白字符类别。
换一种"看起来也是空格"的字符——不换行空格 (常见于网页复制粘贴的文本),再测一遍。
StringStripVsTrimDemo.java String s2 = " world "; // 不换行空格包裹 s2.trim(); s2.strip(); Character.isWhitespace(' ');
s2.trim() 真实结果长度: 7(trim真实没有去掉不换行空格 )
s2.strip() 真实结果长度: 7(意外:strip()真实也没有去掉 )
Character.isWhitespace(' ') 真实结果: false(真实原因:不换行空格被isWhitespace明确排除在外)
Java11同批引入的另外几个字符串方法,一并验证。
" ".isBlank() 真实结果: true " ".isBlank() 真实结果: true(全角空格也真实被认为是空白) "".isEmpty() vs isBlank(): true / true " ".isEmpty() vs isBlank(): false / true(isEmpty只看长度,isBlank真实检查内容) stripLeading() 真实结果: "both sides " stripTrailing() 真实结果: " both sides"
真实结果验证了 isBlank() 判断的是"内容上是否全是空白字符",和只看长度的 isEmpty() 是两个完全不同维度的检查——一个只有一个空格的字符串,isEmpty() 真实是 false,但 isBlank() 真实是 true。stripLeading()/stripTrailing() 则真实验证了只处理单侧,互不影响另一侧的空白。
每一行都是真实运行这段代码得到的结果。