1、拼接方式

常见拼接方式有以下四种:
(1)使用符号‘+’拼接
(2)String类中的concat方法拼接
(3)使用StringBuffer拼接
(4)使用StringBuilder拼接
(5)StringUtils.join

2、使用选择

  • 如果只是简单的字符串拼接,不是在循环体中进行字符串拼接的话,直接使用+就好了
  • 如果是在 for 循环中进行字符串拼接,考虑使用StringBuilder和StringBuffer
  • 如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder
  • 如果是通过一个List进行字符串拼接,则考虑使用StringUtils.join和StringJoiner

3、详情区别

3.1 ‘+’拼接

原理:
使用+拼接字符串,其实只是Java提供的一个语法糖,其实现原理是StringBuilder.append

// 使用符号‘+’拼接字符串
String hollis = wechat + "," + introduce;
// 上面代码的反编译结果
String hollis = (new StringBuilder()).append(wechat).append(",").append(introduce).toString();

从反编译后的代码,使用+拼接字符串每次都是new了一个StringBuilder,然后再把String转成StringBuilder,再进行append。
注意:
如果在for循环中使用+拼接字符串,会频繁的new一个对象,不仅仅会耗费时间,还会造成内存资源的浪费。
根据阿里巴巴Java开发手册建议:循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展,而不要使用+。

3.2 String类中的concat方法

用法:

String hollis = "wechat".concat(",").concat("introduce");

原理:

  • concat方法首先创建了一个字符数组,长度是已有字符串和待拼接字符串的长度之和,再把两个字符串的值复制到新的字符数组中,并使用这个字符数组创建一个新的 String 对象并返回。
  • 经过 concat 方法,其实是new了一个新的 String,这也就呼应到前面我们说的字符串的不变性问题上了。
3.3 StringBuffer和StringBuilder

原理:

  • StringBuffer和StringBuilder都继承了AbstractStringBuilder类,在AbstractStringBuilder类中定义了一个字符数组 char[] value ,与String类中不同的是,它没有final修饰符,所以是可以被修改的

区别:

StringBuffer 和 StringBuilder 最大的区别就是 StringBuffer是线程安全的,StringBuffer使用synchronized进行声明,重写了AbstractStringBuilder类中的部分方法,这也导致了StringBuffer时间效率没有StringBuilder高

3.4 StringUtils.join

原理:

StringUtils.join是通过StringBuffer实现的,其最主要的功能是 将数组或集合以某拼接符拼接到一起形成新的字符串。

3.5 StringJoiner

原理:

StringJoiner 是 java.util包中的一个类,用于构造一个由分隔符分隔的字符序列(可选),并且可以从提供的前缀开始并以提供的后缀结尾。其实现原理也是依赖的StringBuilder类