StringJoiner 是 java.util 包中的一个类,用于构造一个由分隔符分隔的字符串,并且可以从提供的前缀字符串开头,以提供的后缀字符串结尾。虽然这些功能,我们可以使用 StringBuilder 或者 StringBuffer 来实现的, 但是 StringJoiner 提供的方法更简单,而且也不需要写大量的代码就能成。
StringJoiner 一共有 2 个构造函数。 构造函数很简单,就是对 分隔符,前缀和后缀字符串的初始化。
public StringJoiner(CharSequence delimiter) {
this(delimiter, “”, “”);//默认前缀和后缀为"",重载调用
}
public StringJoiner(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
//间隔符,前缀和后缀判断是否为null,null将抛出异常
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”);
//成员变量赋值
this.prefix = prefix.toString();
this.delimiter = delimiter.toString();
this.suffix = suffix.toString();
//空值被设置为只有前后缀
this.emptyValue = this.prefix + this.suffix;
}
StringJoiner 的用法其实很简单,来,我们看一下 StringJoiner 字符串拼接的用法。
public class StringJoinerTest {
public static void main(String[] args) {
StringJoiner sj = new StringJoiner(“hello”);
sj.add("Java 8 ");
sj.add(“Java 11”);
System.out.println(sj.toString());
StringJoiner sj1 = new StringJoiner(":","[","]");
sj1.add(“Java8”).add(“Java11”).a
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
dd(“Java15”);
System.out.println(sj1.toString());
}
}
输出结果:
Java 8 helloJava 11
[Java8:Java11:Java15]
注意:
-
当我们使用StringJoiner(CharSequence delimiter)初始化一个StringJoiner的时候,这个delimiter其实是分隔符,并不是字符串的初始值。
-
StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix)的第二个和第三个参数分别是拼接后的字符串的前缀和后缀。
JDK8中源码
public StringJoiner setEmptyValue(CharSequence emptyValue) {
this.emptyValue = Objects.requireNonNull(emptyValue,
“The empty value must not be null”).toString();
return this;
}
@Override
public String toString() {
if (value == null) {
return emptyValue;
} else {
if (suffix.equals("")) {
return value.toString();
} else {
int initialLength = value.length();
String result = value.append(suffix).toString();
value.setLength(initialLength);
return result;
}
}
}
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
public StringJoiner merge(StringJoiner other) {
Objects.requireNonNull(other);
if (other.value != null) {
final int length = other.value.length();
StringBuilder builder = prepareBuilder();
builder.append(other.value, other.prefix.length(), length);
}
return this;
}
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
}
public int length() {
return (value != null ? value.length() + suffix.length() :
emptyValue.length());
}
JDK11中源码
public final class StringJoiner {
private String[] elts;
@Override
public String toString() {
final String[] elts = this.elts;
if (elts == null && emptyValue != null) {
return emptyValue;
}
final int size = this.size;
final int addLen = prefix.length() + suffix.length();
if (addLen == 0) {
compactElts();
return size == 0 ? “” : elts[0];
}
final String delimiter = this.delimiter;