Java 11 中 String trim() 和 strip() 方法的区别

新手上路,请多包涵

在其他变化中,JDK 11 为 java.lang.String 类引入了 6 个新方法:

  • repeat(int) - 根据 int 参数提供的字符串重复次数
  • lines() - 使用Spliterator懒惰地提供来自源字符串的行
  • isBlank() - 指示字符串是否为空或仅包含空白字符
  • 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() 之间究竟有什么区别?

原文由 Mikhail Kholodkov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

简而言之: strip() 是--- trim() —的“Unicode-aware”演变。含义 trim() 仅删除字符 <= U+0020(空格); strip() 删除所有 Unicode 空白字符(但不是所有控制字符,例如 \0)

企业社会责任:JDK-8200378

问题

String::trim 在 Java 的早期就已经存在,当时 Unicode

还没有完全发展到我们今天广泛使用的标准。

String::trim 使用的空间定义是小于或等于空间代码点 (\u0020) 的任何代码点,通常称为 ASCII 或 ISO 控制字符。

Unicode 感知修整例程应使用 Character::isWhitespace(int)。

此外,开发人员无法专门删除缩进空格或专门删除尾随空格。

解决方案

引入识别 Unicode 空格的修整方法,并提供对仅前导或仅尾随的额外控制。

这些新方法的一个共同特征是它们使用与旧方法(例如 String.trim() )不同(更新)的“空白”定义。漏洞 JDK-8200373

String::trim 的当前 JavaDoc 没有明确说明代码中使用了哪个“空格”定义。随着在不久的将来使用不同空间定义的其他修剪方法的出现,澄清是必要的。 String::trim 使用空格的定义作为小于或等于空格字符代码点 (\u0020.) 的任何代码点。较新的修剪方法将使用(白色)空格的定义作为传递给Character::isWhitespace 谓词。

The method isWhitespace(char) was added to Character with JDK 1.1, but the method isWhitespace(int) was not introduced to the Character class until JDK 1.5.添加了后一种方法(接受类型为 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 变更集


trim()strip() 之间的基准比较 - 为什么 String.strip() 比 String.trim() 快 5 倍用于空字符串在 Java 11

原文由 Mikhail Kholodkov 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是一个单元测试,它使用 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());
    }
}

原文由 Michael Easter 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题