Java中String的trim和strip函数的区别
String.trim
trim 函数的作用是删除字符串头尾的空白,但是我们查看 trim 函数的源代码如下:
StringLatin
// https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/StringLatin1.java
public static String trim(byte[] value) {
int len = value.length;
int st = 0;
while ((st < len) && ((value[st] & 0xff) <= ' ')) {
st++;
}
while ((st < len) && ((value[len - 1] & 0xff) <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ?
newString(value, st, len - st) : null;
}
StringUTF16
// https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/StringUTF16.java
public static String trim(byte[] value) {
int length = value.length >> 1;
int len = length;
int st = 0;
while (st < len && getChar(value, st) <= ' ') {
st++;
}
while (st < len && getChar(value, len - 1) <= ' ') {
len--;
}
return ((st > 0) || (len < length )) ?
new String(Arrays.copyOfRange(value, st << 1, len << 1), UTF16) :
null;
}
我们可以发现,这两个 String 的实现,实际上都只去除了普通的空格符号。
那么这有什么问题呢?我们注意到,所谓的空格其实并不止一种,空格除了普通的' '外,实际上 tab 和换行符其实也算是空白字符,这也就会导致如果字符串前后存在这些字符的情况下,trim 函数无法发挥其去除空白的功能。
也就是说,trim 函数是一个“去除字符串前后‘ ’字符”的具有局限性的函数,在某些情况下其实不能很好地工作。
String.strip
strip 函数的作用同样是去除字符串收尾的空白,但是它使用的方法就与 trim 函数有所不同:
StringLatin
// https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/StringLatin1.java
public static String strip(byte[] value) {
int left = indexOfNonWhitespace(value);
if (left == value.length) {
return "";
}
int right = lastIndexOfNonWhitespace(value);
boolean ifChanged = (left > 0) || (right < value.length);
return ifChanged ? newString(value, left, right - left) : null;
}
StringUTF16
// https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/StringUTF16.java
public static String strip(byte[] value) {
int length = value.length >>> 1;
int left = indexOfNonWhitespace(value);
if (left == length) {
return "";
}
int right = lastIndexOfNonWhitespace(value);
boolean ifChanged = (left > 0) || (right < length);
return ifChanged ? newString(value, left, right - left) : null;
}
可以看到,strip函数是调用了 indexOfNonWhitespace 和 lastIndexOfNonWhitespace 两个函数来辅助实现去除空格的效果的,那么我们接着查看这两个函数,这两个函数实际上都使用到了类似这一段代码:
if (ch != ' ' && ch != '\t' && !CharacterDataLatin1.instance.isWhitespace(ch)) {
break;
}
也就是说,其判断的空白字符包括了空格、tab 以及 isWhitespace 函数判断为空白的字符,而这个函数将以下字符认为是空白的:
- Unicode 空白字符(SPACE_SEPARATOR、LINE_SEPARATOR 或
PARAGRAPH_SEPARATOR),但不是一个不间断空格(’\u00A0’、’\u2007’ 和 ‘\u202F’)。 - ‘\u0009’,水平制表符’\t’。
- ‘\u000A’,换行’\n’。
- ‘\u000B’,纵向制表符。
- ‘\u000C’,换页’\f’。
- ‘\u000D’,回车’\r’。
- ‘\u001C’,文件分隔符。
- ‘\u001D’,组分隔符。
- ‘\u001E’,记录分隔符。
- ‘\u001F’,单元分隔符
也就是说,使用 strip 函数可以去除的空格类型是远多于 trim 函数的,这也是为什么我们在一般场景下使用 strip函数可以避免一些奇怪的问题。
浙公网安备 33010602011771号