1、使用 + 完成拼接字符串常量
String str1 = "hello";
String str2 = "world";
String str3 = "hello" + "world";
反编译以后的代码,
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修饰保证线程安全,相对效率会差一点。
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
3、concat() 方法
String str1 = "hello";
String str2 = "world";
String str3 = str1.cancat("world").
注意:这个方法只能用于拼接字符串,不能拼接其他类型的数据)将指定的字符串拼接到该字符串的末尾。并且字符串本身和拼接的字符串都不能为null,否则运行程序后会报空指针异常NullPointerException。
小结:
字符串拼接过程中会创建新的对象,如果要在一个循环体中进行字符串拼接,就要考虑效率问题。使用StringBuilder的方式是效率最高的,但是存在线程安全问题。如果不是在循环体中进行字符串拼接的话,用 + 就可以。