在码代码的过程当中,难免会遇到处理一些字符串拼接的问题,最让人容易想到的方法就是使用+进行操作。
但是对于运算量大的时候,十分不推荐使用+,不仅代码不够优雅,还存在效率问题。
方法一:使用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相关方法。