原始碼級分析測試徹底搞懂String.trim()到底幹了什麼[base jdk8]
注:平時開發中經常使用也很簡單,話不多說
原始碼
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字元表
相關文章
- vue $set到底幹了什麼Vue
- 徹底搞懂 RxJava — 中級篇RxJava
- 徹底搞懂js裡的__proto__和prototype到底有什麼區別?JS
- 為了徹底搞懂 hashCode,我鑽了一下 JDK 的原始碼JDK原始碼
- new操作符到底幹了什麼
- new操作符到底幹了什麼?
- 徹底搞懂徹底搞懂事件驅動模型 - Reactor事件模型React
- [原始碼解讀]一文徹底搞懂Events模組原始碼
- 徹底搞懂 RxJavaRxJava
- 徹底搞懂MySQL為什麼要使用B+樹索引MySql索引
- Java原始碼分析:HashMap 1.8 相對於1.7 到底更新了什麼?Java原始碼HashMap
- JS繼承,中間到底幹了些什麼JS繼承
- 徹底搞懂 MySQL 事務的隔離級別MySql
- 徹底搞懂https原理HTTP
- 徹底搞懂JavaScript作用域JavaScript
- 徹底搞懂Bean載入Bean
- 徹底搞懂 Git-RebaseGit
- JDBC連線中Class.forName("")到底幹了什麼?JDBC
- 徹底搞懂 python 中文亂碼問題Python
- HashMap原始碼分析(二):看完徹底瞭解HashMapHashMap原始碼
- Google到底在幹什麼?Go
- 軟體測試是幹什麼的
- 深入JavaScript系列(四):徹底搞懂thisJavaScript
- 徹底搞懂 Channel 實現原理
- 徹底搞懂 RxJava — 基礎篇RxJava
- 徹底搞懂 RxJava — 高階篇RxJava
- HashMap原始碼分析(JDK8)HashMap原始碼JDK
- 遊戲&軟體測試到底是什麼?遊戲測試理論詳解來了!遊戲
- 徹底搞懂JavaScript中的繼承JavaScript繼承
- 徹底搞懂Python中的類Python
- 看完讓你徹底搞懂Websocket原理Web
- 兩萬字長文,徹底搞懂Kafka!Kafka
- 徹底搞懂JavaScript原型和原型鏈JavaScript原型
- 一文搞懂到底什麼是 AQSAQS
- pygame.error: font not initialized的解決及init()到底幹了什麼GAMErrorZed
- 【vue原始碼解析】render到底做了什麼?Vue原始碼
- 徹底搞懂原型、原型鏈和繼承原型繼承
- 從原理到實戰,徹底搞懂NginxNginx