在其他更改中,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()
之间到底有什么区别?
答案 0 :(得分:66)
简而言之:strip()
是trim()
的“可识别Unicode的版本。”
问题
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设置而看不到类似的输出。您可以尝试一些在线编译器来测试此代码。
答案 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 '