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


103

在其他更改中,JDK 11为java.lang.String类引入了6种新方法:

  • repeat(int)-重复字符串多次通过所提供的int参数
  • lines() -使用分隔符从源字符串懒惰地提供行
  • isBlank() -指示字符串是否为空或仅包含空格字符
  • stripLeading() -从开头删除空白
  • stripTrailing() -从末端去除空白
  • strip() -删除字符串开头和结尾的空格

尤其strip()看起来与十分相似trim()。按照本文的规定, strip*()方法旨在:

String.strip(),String.stripLeading()和String.stripTrailing()方法从目标String的正面,背面或正面和背面修剪空白[由Character.isWhiteSpace()确定)。

String.trim() JavaDoc指出:

/**
  * Returns a string whose value is this string, with any leading and trailing
  * whitespace removed.
  * ...
  */

这几乎与上面的引用相同。

String.trim()String.strip()Java 11以来的区别到底是什么?

Answers:


105

简而言之:strip()是的“支持Unicode的”演变trim()

企业社会责任:JDK-8200378

问题

String :: trim从Java的早期开始就存在,当时Unicode尚未完全发展为我们今天广泛使用的标准。

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

支持Unicode的修剪例程应使用Character :: isWhitespace(int)。

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

介绍可识别Unicode空白的修整方法,并提供仅前导或仅尾随的附加控制。

这些新方法的共同特征是,它们使用的旧方法(例如)使用不同的(较新的)“空白”定义String.trim()。错误JDK-8200373

当前的JavaDoc for String :: trim尚不清楚代码中使用了哪个“空格”定义。随着不久的将来会出现其他使用不同空间定义的修整方法,因此有必要进行澄清。String :: trim使用空格的定义作为小于或等于空格字符代码点(\ u0020)的任何代码点。较新的修整方法将使用(白色)空格的定义作为传递给参数时返回true的任何代码点。字符:: isWhitespace谓词。

该方法isWhitespace(char)是在CharacterJDK 1.1中添加的,但是直到JDK 1.5才将该方法isWhitespace(int)引入到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


trim()和之间的基准比较strip()- 为什么Java 11中的String.strip()比String.trim()快5倍


6
有趣的是,符号'\ u0000'不会被删除,而是被修剪删除。
CHEM_Eugene

32

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

0

通常,两种方法都从字符串中删除前导和尾随空格。但是,区别在于我们使用Unicode字符或多语言功能时。

trim()删除ASCII值小于或等于32('U + 0020'或空格)的所有前导和尾随字符。

根据Unicode标准,存在各种ASCII值大于32('U + 0020')的空格字符。例如:8193(U + 2001)。

为了识别这些空格字符,Java 1.5在Character类中添加了新方法isWhitespace(int)。此方法使用unicode识别空格字符。您可以在此处阅读有关Unicode空格字符的更多信息。

在Java 11中添加的新方法条使用了Character.isWhitespace(int)方法来覆盖广泛的空白字符并将其删除。

public class StringTrimVsStripTest {
    public static void main(String[] args) {
        String string = '\u2001'+"String    with    space"+ '\u2001';
        System.out.println("Before: \"" + string+"\"");
        System.out.println("After trim: \"" + string.trim()+"\"");
        System.out.println("After strip: \"" + string.strip()+"\"");
   }
}

输出量

Before: "  String    with    space  "
After trim: " String    with    space "
After strip: "String    with    space"

注意:如果您在Windows计算机上运行,​​则由于限制了unicode设置,您可能看不到类似的输出。您可以尝试一些在线编译器来测试此代码。

参考: 修剪和剥离方法java之间的区别

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.