StringJoiner源码阅读
昨天看到一个非常有意思的类StringJoiner。 今天就来看下是怎么实现的。大概看了下,仍然是基于StringBuilder实现的。(昨天首先想到的是StringBuffer...这个习惯要纠正下) 那么这里先抛个疑问StringJoiner是线程安全的吗?
append 昨天理解错了 以为join出来的是 [1],[2],[3] 这种结构的,结果是 [1,2,3] = =....
public final class StringJoiner {
private final String prefix; // 前缀
private final String delimiter; //分隔符
private final String suffix; //后缀
private StringBuilder value; //拼接的内容串就放在这里
private String emptyValue; //?? 默认串 看注释是当value为空时调用toString()返回的默认字符串!
//这个变量不是final的,也提供了public StringJoiner setEmptyValue(CharSequence emptyValue) 供调用者自己定义返回的默认值。
....
}
//测试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}
**/
了解了大概结构 后面的主要方法理解起来就很容易了先是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 那在哪里加上呢?
//当然是在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); //复位!
return result;
}
}
}
上面就是StringJoiner的主要工作原理了
值得注意的是length方法
如果value为空的时候返回 emptyValue的长度 不为空的时候 返回value + suffix的长度
网友评论