首页 > 解决方案 > Java 11 中 String trim() 和 strip() 方法的区别

问题描述

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

特别是,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.
  * ...
  */

这几乎与上面的报价相同。

String.trim()Java 11和自 Java 11 以来到底有什么区别String.strip()

标签: javastringtrimstripjava-11

解决方案


简而言之:strip()trim(). 含义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) 的任何代码点。较新的修剪方法将使用(空白)空格的定义作为传递给时返回 true 的任何代码点Character::isWhitespace 谓词。

JDK 1.1isWhitespace(char)添加了该方法,但直到 JDK 1.5 才将该方法引入该类。添加了后一种方法(接受 type 参数的方法)以支持补充字符。该类的 Javadoc 注释定义了补充字符(通常使用基于 int 的“代码点”建模)与 BMP 字符(通常使用单个字符建模):CharacterisWhitespace(int)CharacterintCharacter

从 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() 在 Java 11 中的空白字符串快 5 倍


推荐阅读