源码级分析测试彻底搞懂String.trim()到底干了什么[base jdk8]
2018-02-03 22:32
686 查看
注:平时开发中经常使用也很简单,话不多说
![](https://oscdn.geek-share.com/Uploads/Images/Content/201802/64bea2b2743fe6a0f6663773127218f0)
上图红框中\u0020代表的是空格,那么是不是源码中那个比较的" ",下面测试来验证!
参考:Unicode字符表
源码
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字符表
相关文章推荐
- Ext源码分析:Ext.onReady到底做了什么?
- 分析源码到底是为了什么
- 从vue.js的源码分析,input和textarea上的v-model指令到底做了什么
- Ext源码分析:Ext.onReady到底做了什么?
- HDFS源码分析:“-put”到底做了些什么(客户端)
- 从vue.js的源码分析,input和textarea上的v-model指令到底做了什么
- Ext源码分析:Ext.onReady到底做了什么
- Ext源码分析:Ext.onReady到底做了什么?
- 实例分析Java中public static void main(String args[])是什么意思
- linux内核源码分析——linux/stringify.h
- 深入java String JVM对String对象的连接优化 一(源码分析)
- 实验报告: 人脸识别方法回顾与实验分析 【OpenCV测试方法源码】
- JDK源码分析之String篇
- getResource(String name)用法及源码分析
- 实例分析Java中public static void main(String args[])是什么意思
- JDK源码分析之String(一)
- Android的Message Pool是个什么鬼——源码角度分析
- 【JAVA源码分析——Java.lang】String源码分析
- tomcat源码分析之getParameter(String)与getQueryString()
- 别迷信自动化测试-自动化测试到底能帮你做什么?【转】