Joiner类的基本功能:
将字符串数组按指定分隔符连接起来,或字符串串按指定索引开始使用指定分隔符连接起来,通过Join类,我们可以方便实现将容器中的数据按照自定义的方式拼接成一个字符串,而且这是一种线程安全的方式。
变量:
//分隔符
构造方法:
这两个构造函数都是静态构造器,所以不能直接使用这两个构造器去创建Joiner,所以想要创建Joiner只能使用静态方法。可接收字符串和字符,字符串可以为空,字符不能为空字符。
静态创建Joiner方法
这两个方法是:一个传入字符串;一个传入字符,然后直接分别使用两个构造器构造的。
Join实现类
public final String join(Iterable<?> parts) {
return join(parts.iterator());
}
public final String join(Iterator<?> parts) {
return appendTo(new StringBuilder(), parts).toString();
}
public final StringBuilder appendTo(StringBuilder builder, Iterator<?> parts) {
try {
appendTo((Appendable) builder, parts);
} catch (IOException impossible) {
throw new AssertionError(impossible);
}
return builder;
}
/*
上面代码是一种重载的思想,最终是通过appendTo方法进行的字符创拼接,
注意到这里传入的第一个参数是一个StringBuilder对象,为了就是保证线程的安全性,
防止多线程环境下可能出现的问题。
*/
/*
ppendTo函数实现
*/
public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException {
checkNotNull(appendable);
if (parts.hasNext()) {
appendable.append(toString(parts.next()));
while (parts.hasNext()) {
appendable.append(separator);
appendable.append(toString(parts.next()));
}
}
return appendable;
}
/*可以看到这里首先检查了一下这个StringBuilder是否为空,如果为空就会抛出异常。
再然后就是迭代器的遍历了,注意到这里有一个toString()方法,很明显,这里重写了Object类的这个方法*/
CharSequence toString(Object part) {
checkNotNull(part); // checkNotNull for GWT (do not optimize).
return (part instanceof CharSequence) ? (CharSequence) part : part.toString();
}
/*同样这里做了类型检查,就是为了防止容器中有null对象,其次就是如果part本身就是字符数组了,就不用调用tostring方法了,节约系统资源。
除了第一个元素外,其余每一个元素都是分隔符与元素的拼接,很简单的逻辑。就这样完成了一次拼接操作。*/