StringJoiner源碼閱讀

StringJoiner源碼閱讀

昨天看到一個非常有意思的類StringJoiner。 今天就來看下是怎么實現(xiàn)的。大概看了下,仍然是基于StringBuilder實現(xiàn)的。(昨天首先想到的是StringBuffer...這個習(xí)慣要糾正下) 那么這里先拋個疑問StringJoiner是線程安全的嗎?

append 昨天理解錯了 以為join出來的是 [1],[2],[3] 這種結(jié)構(gòu)的,結(jié)果是 [1,2,3] = =....

public final class StringJoiner {
    private final String prefix; // 前綴
    private final String delimiter; //分隔符
    private final String suffix; //后綴
    
    private StringBuilder value; //拼接的內(nèi)容串就放在這里
    private String emptyValue; //?? 默認(rèn)串 看注釋是當(dāng)value為空時調(diào)用toString()返回的默認(rèn)字符串! 
     //這個變量不是final的,也提供了public StringJoiner setEmptyValue(CharSequence emptyValue) 供調(diào)用者自己定義返回的默認(rèn)值。
....
}


    //測試emptyValue
        @Test
        public void testOne(){

        StringJoiner sj = new StringJoiner(",","{","}");

        System.out.println(sj.toString());

        sj.setEmptyValue("this is empty");

        System.out.println(sj.toString());

        sj.add("first");

        System.out.println(sj.toString());

    }
    
    /** 輸出    
    {}
    this is empty
    {first}
    **/
   

了解了大概結(jié)構(gòu) 后面的主要方法理解起來就很容易了先是add方法


    public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
    
    //prepareBuilder() 主要做了兩件事情,
    //如果value為空則初始化value = new StringBuilder(); 然后加上 prefix + newElement
    //如果value不為空則 value + delimiter + newElement;
    
    //所以add之后,value的尾巴最后都木有 suffix 那在哪里加上呢?
    
    //當(dāng)然是在toString的時候了    
    @Override
    public String toString() {
        if (value == null) {
            return emptyValue;
        } else {
            if (suffix.equals("")) {
                return value.toString();
            } else {
                int initialLength = value.length();  //記錄沒有加上suffer的時候的長度
                String result = value.append(suffix).toString();
                // reset value to pre-append initialLength
                value.setLength(initialLength); //復(fù)位!
                return result;
            }
        }
    }   

上面就是StringJoiner的主要工作原理了
值得注意的是length方法
如果value為空的時候返回 emptyValue的長度 不為空的時候 返回value + suffix的長度

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,677評論 18 399
  • 集合框架: 1)特點:存儲對象;長度可變;存儲對象的類型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang閱讀 1,386評論 0 4
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,647評論 0 3
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,450評論 0 16
  • 有情飲水飽,無事閑來嬌。 遇見的時候總是被眼前的人迷了眼,不知幾時會紅了眼,能這么悲觀的去想,我知道我是動了心,動...
    思似柳萬絳閱讀 508評論 0 0

友情鏈接更多精彩內(nèi)容