反编译以后的代码,
String str1 = "hello";String str2 = "world";String str3 = (new StringBuilder()).append("hello").append("world").toString();可以看出,原来字符串常量在拼接过程中,JVM会优化成创建StringBuilder的匿名对象,使用其append方法拼接l
也就是说,Java中的 + 对字符串常量的拼接,其实现原理是使用StringBuilder.append来提高效率。
2、StringBuffer和StringBuilder的append()StringBuilder类封装了一个字符数组:private char value[];
与String不同的是,它并不是final的,所以他是可以修改的。另外,与String不同,字符数组中不一定所有位置都已经被使用,它有一个实例变量,==int count;==表示数组中已经使用的字符个数
append源码如下:
public StringBuilder append(String str) { super.append(str); return this;}查看其父类AbstractStringBuilder
public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this;}append会直接拷贝字符到内部的字符数组中,如果字符数组长度不够,就进行扩容。
StringBuffer和StringBuilder最大的区别在于是线程安全问题。StringBuffer用synchronized修饰保证线程安全,相对效率会差一点。
注意:这个方法只能用于拼接字符串,不能拼接其他类型的数据)将指定的字符串拼接到该字符串的末尾。并且字符串本身和拼接的字符串都不能为null,否则运行程序后会报空指针异常NullPointerException。
小结:字符串拼接过程中会创建新的对象,如果要在一个循环体中进行字符串拼接,就要考虑效率问题。使用StringBuilder的方式是效率最高的,但是存在线程安全问题。如果不是在循环体中进行字符串拼接的话,用 + 就可以。