public StringJoiner(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
Objects.requireNonNull(prefix, "The prefix must not be null");
Objects.requireNonNull(delimiter, "The delimiter must not be null");
Objects.requireNonNull(suffix, "The suffix must not be null");
// make defensive copies of arguments
this.prefix = prefix.toString();
this.delimiter = delimiter.toString();
this.suffix = suffix.toString();
this.emptyValue = this.prefix + this.suffix;
}
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
}
我们看到prepareBuilder方法中,如果value为空,则new StringBuilder(),而StringBuilder()构造方法调用了AbstractStringBuilder(int capacity) {value = new char[capacity]; }的初始化方法,实则创建了一个容量为16的字节数组。所以StringJoiner的底层就是字节数组实现的,内部就是一个StringBuilder。
length()方法#
public int length() {
// Remember that we never actually append the suffix unless we return
// the full (present) value or some sub-string or length of it, so that
// we can add on more if we need to.翻译(//*请记住,除非返回完整(当前)值或其子字符串或长度,
否则我们不会实际附加后缀,以便在需要时添加更多后缀。*)
return (value != null ? value.length() + suffix.length() :
emptyValue.length());
}
public StringJoiner setEmptyValue(CharSequence emptyValue) {
this.emptyValue = Objects.requireNonNull(emptyValue,
"The empty value must not be null").toString();
return this;
}
merge(StringJoiner other)方法:这个平时没怎么用过,看了下方法上面的注释, merge首先会调用prepareBuilder()创建一个StringBuilder,然后利用StringBuilder的append方法,把other的值追加到StringBuilder中,append(CharSequence s, int start, int end)方法参数,第一个是值,第二个start是从s值的哪个位置开始,end指截取到多少,相当于other.substring(1,13)
public StringJoiner merge(StringJoiner other) {
Objects.requireNonNull(other);
if (other.value != null) {
final int length = other.value.length();
// lock the length so that we can seize the data to be appended
// before initiate copying to avoid interference, especially when
// merge 'this'
StringBuilder builder = prepareBuilder();
builder.append(other.value, other.prefix.length(), length);
}
return this;
}
toString()方法
@Override
public String toString() {
if (value == null) {
return emptyValue;//如果value为空,说明可能只是初始化过
} else {
if (suffix.equals("")) {
return value.toString();//后缀为空,直接返回value
} else {
int initialLength = value.length();
String result = value.append(suffix).toString();
// reset value to pre-append initialLength #**这里重新设置length,是否toString的length不包含后缀长度呢**
value.setLength(initialLength);
return result;
}
}
}