Java 11中的String trim()和strip()方法之间的区别
在其他更改中,JDK 11为java.lang.String类引入了6种新方法:
-
repeat(int)
– 重复String的次数与int
参数提供的次数相同 -
lines()
– 使用Spliterator从源字符串延迟提供行 -
isBlank()
– 指示String是否为空或仅包含空格字符 -
stripLeading()
– 从头开始删除空格 -
stripTrailing()
– 从末尾删除空格 -
strip()
– 从字符串的开头和结尾删除空格
特别是, strip()
看起来非常类似于trim()
。 根据这篇文章, strip*()
方法旨在:
String.strip(),String.stripLeading()和String.stripTrailing()方法修剪目标字符串的正面,背面或正面和背面的空白[由Character.isWhiteSpace()确定]。
String.trim()
JavaDoc声明:
/** * Returns a string whose value is this string, with any leading and trailing * whitespace removed. * ... */
这几乎与上面的引用相同。
自Java 11以来, String.trim()
和String.strip()
之间到底有什么区别?
简而言之: strip()
是trim()
“Unicode-aware”演变。
CSR:JDK-8200378
问题
String :: trim早在Java早期就存在,当时Unicode还没有完全发展到我们今天广泛使用的标准。
String :: trim使用的空间定义是小于或等于空格代码点(\ u0020)的任何代码点,通常称为ASCII或ISO控制字符。
支持Unicode的修剪例程应该使用Character :: isWhitespace(int)。
此外,开发人员无法专门删除缩进空白区域或专门删除尾随空白区域。
解
引入可识别Unicode空白区域的修剪方法,并提供对仅前导或仅尾随的附加控制。
这些新方法的一个共同特征是它们使用与旧方法(如String.trim()
不同(更新)的“空格”定义。 错误JDK-8200373 。
String :: trim的当前JavaDoc不清楚代码中使用了“space”的哪个定义。 随着近期使用不同空间定义的修剪方法,澄清是必不可少的。 String :: trim使用space的定义作为任何小于或等于空格字符代码点的代码点(\ u0020。)较新的修剪方法将使用(白色)空间的定义作为传递给传递给它时返回true的任何代码点。 Character :: isWhitespace谓词。
方法isWhitespace(char)
被添加到带有JDK 1.1的Character
,但是方法isWhitespace(int)
在JDK 1.5之前没有被引入到Character
类中。 后一种方法(接受int
类型参数的方法)被添加以支持增补字符。 Character
类的Javadoc注释定义了补充字符(通常使用基于int的“代码点”建模)与BMP字符(通常使用单个字符建模):
从U + 0000到U + FFFF的字符集有时被称为基本多语言平面(BMP)。 代码点大于U + FFFF的字符称为增补字符。 Java平台在char数组和String和StringBuffer类中使用UTF-16表示。 在此表示中,补充字符表示为一对char值…因此,char值表示基本多语言平面(BMP)代码点,包括代理代码点或UTF-16编码的代码单元。 int值表示所有Unicode代码点,包括补充代码点。 …仅接受char值的方法不支持增补字符。 …接受int值的方法支持所有Unicode字符,包括补充字符。
OpenJDK Changeset 。
这是一个unit testing,用Java 11来说明@MikhailKholodkov的答案。
(注意\u2000
高于\u0020
并且不被trim()
视为空白)
public class StringTestCase { @Test public void testSame() { String s = "\t abc \n"; assertEquals("abc", s.trim()); assertEquals("abc", s.strip()); } @Test public void testDifferent() { Character c = '\u2000'; String s = c + "abc" + c; assertTrue(Character.isWhitespace(c)); assertEquals(s, s.trim()); assertEquals("abc", s.strip()); } }