原始碼級分析測試徹底搞懂String.trim()到底幹了什麼[base jdk8]

FeelTouch發表於2018-02-03

注:平時開發中經常使用也很簡單,話不多說

原始碼

    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的所有字元,並且返回了一個新的子串;在為空的時候返回一個新的空串""。




相關文章