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的長度