在码代码的过程当中,难免会遇到处理一些字符串拼接的问题,最让人容易想到的方法就是使用+进行操作。

但是对于运算量大的时候,十分不推荐使用+,不仅代码不够优雅,还存在效率问题。

 

方法一:使用StringBuilder进行拼接

String[] strs = {"a", "b", "c"};
StringBuilder sb = new StringBuilder();
sb.append(strs[0]);
for (int i = 1; i < strs.length(); i++) {
    sb.append(",");
    sb.append(strs[i]);
}
System.out.println(sb.toString()); // "a,b,c"

StringBuffer同StringBuilder,他们最大的区别在于StringBuffer为线程安全,而StringBuilder为线程不安全。

方法二:使用StringJoiner 进行拼接

String[] strs = {"a", "b", "c"};
StringJoiner sj = new StringJoiner(",");
for (String str : strs) {
    sj.add(str);
}
System.out.println(sj.toString()); // "a,b,c"

StringJoiner为java1.8提供的分隔符拼接类,构造函数:StringJoiner(CharSequence delimiter)仅提供分隔符;

StringJoiner(CharSequence delimiter,CharSequence prefix,CharSequence suffix)提供分隔符与前后缀,对于需要前后缀拼接需求天然友好。

StringJoiner的底层实现为StringBuilder,故StringJoiner性能与StringBuilder性能接近,是线程非安全类。

方法三:使用String.join

String[] strs = {"a", "b", "c"};
String str = String.join(",", strs);
System.out.println(str);

java1.8新增的方法,此方法底层实现使用了StringJoiner。

方法四:使用Collectors.joining

String[] strs = {"a", "b", "c"};
String str = Arrays.stream(strs).collect(Collectors.joining(","));
System.out.println(str);

下面为Collectors.joining源码

public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
                                                             CharSequence prefix,
                                                             CharSequence suffix) {
    return new CollectorImpl<>(
        () -> new StringJoiner(delimiter, prefix, suffix),
        StringJoiner::add, StringJoiner::merge,
        StringJoiner::toString, CH_NOID);
}

 此方法的底层原理也依赖于StringJoiner,这也是StringJoiner类存在的一个重要原因。

 

总结

1、若只是几个有限的简单的字符串拼接,可直接使用+;

2、在for循环中推荐使用StringBuilder/StringBuffer;

3、若为list或数组,首先考虑StringJoiner相关方法。