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()); } }