您的位置:首页 > 编程语言 > Java开发

源码级分析测试彻底搞懂String.trim()到底干了什么[base jdk8]

2018-02-03 22:32 686 查看
注:平时开发中经常使用也很简单,话不多说

源码

public String trim() {
int len = value.length;
int st = 0;
char[] val = value;    /* avoid getfield opcode */

while ((st < len) && (val[st] <= ' ')) {
st++;
}
while ((st < len) && (val[len - 1] <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}
上述源码看起来很简单,并没有多少特别的地方,关键的判断的代码段
while ((st < len) && (val[st] <= ' ')) {
st++;
}

分析

那么上述代码到底判断了什么,显然不是仅仅去掉了空格,是去掉了某个范围内的所有字符!既然关系到char 不得不看下Unicode字符表了。


上图红框中\u0020代表的是空格,那么是不是源码中那个比较的" ",下面测试来验证!

验证

把其中关键部分的源码拿出来进行验证,代码如下:
/**
* Created by Administrator on 2018/2/3.
*/
public class TrimTest {

public static void main(String[] args) {

char[] chars = new char[25];
chars[0] = '\u0000';
chars[1] = '\u0001';
chars[2] = '\u0002';
chars[3] = '\u0003';
chars[4] = '\u0004';
chars[5] = '\u0005';
chars[6] = '\u0006';
chars[7] = '\u0007';
chars[8] = '\u0008';// \b
chars[9] = '\u0009';// \t
chars[10] = '\u0010';
chars[11] = '\u0012';
chars[12] = '\u0013';
chars[13] = '\u0014';
chars[14] = '\u0015';
chars[15] = '\u0016';
chars[16] = '\u0017';
chars[17] = '\u0018';
chars[18] = '\u0019';
chars[19] = '\u0020';//空格
chars[20] = '\u0021';// !
chars[21] = '\u0022';// "
chars[22] = '\u0023';// #
chars[23] = '\u0024';// $
chars[24] = '\u0025';// %
int len = chars.length;
int st = 0;
char[] val = chars;
while ((st < len) && (val[st] <= ' ')) {
st++;
System.out.print(chars[st]);
}
System.out.println(st);
}
}
 查看测试结结果,即st的输出值:  20

 总结

毫无疑问,trim()用首尾指针的方式删除了开头和结尾处的\u0000 ~ \u0020的所有字符,并且返回了一个新的子串;在为空的时候返回一个新的空串""。
参考:Unicode字符表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: