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

时间:2018-07-10 13:28:54

标签: java string trim strip java-11

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

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

特别地,strip()看起来与trim()非常相似。根据{{​​3}} 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()之间到底有什么区别?

4 个答案:

答案 0 :(得分:66)

简而言之:strip()trim()的“可识别Unicode的版本。”

CSR : JDK-8200378

  

问题

     

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

     

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

     

应识别Unicode的修剪例程   字符:: isWhitespace(int)。

     

此外,开发人员无法专门删除   缩进空格或专门删除结尾的白色   空间。   

     

解决方案

     

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

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

  

当前用于String :: trim的JavaDoc不能清楚地表明哪个   代码中使用了“空间”的定义。与其他   在不久的将来会使用不同的修整方法   定义空间时,必须进行澄清。字符串::修剪使用   将空间定义为小于或等于任何代码点   空格字符代码点(\ 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类。在此表示形式中,补充   字符表示为一对char值...一个char值,   因此,代表基本多语言平面(BMP)代码点,   包括代理代码点或UTF-16的代码单元   编码。一个int值表示所有Unicode代码点,包括   补充代码点。 ...仅接受字符的方法   值不能支持补充字符。 ...的方法   接受一个int值,支持所有Unicode字符,包括   补充字符。

OpenJDK Changeset


trim()strip()-Why is String.strip() 5 times faster than String.trim() for blank string In Java 11之间的基准比较

答案 1 :(得分:15)

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

答案 2 :(得分:2)

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

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

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

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

在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设置而看不到类似的输出。您可以尝试一些在线编译器来测试此代码。

参考: Difference between trim and strip method java

答案 3 :(得分:0)

strip() 和 trim() 输出不同输出的示例:

  String s = "test string\u205F";
  String striped = s.strip();
  System.out.printf("'%s'%n", striped);//'test string'

  String trimmed = s.trim();
  System.out.printf("'%s'%n", trimmed);//'test string '