分析以下代码,共产生了多少个String对象
/**
* Created by wjz on 2017/3/12.
*/
public class StringTest {
public static void main(String[] args) {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String abcd = a + b + c + d;
}
}
一共产生了7个对象,"a","b","c","d","ab","abc","abcd"字符串,由以上的实例看出,通过String直接相加拼接字符串的效率很低,应该使用StringBuffer和StringBuilder类,他们是对String的一种补充,例如:
/**
* Created by wjz on 2017/3/12.
*/
public class StringTest {
public static void main(String[] args) {
String a = "a";
String b = "b";
String c = "c";
String d = "d";
StringBuffer sb = new StringBuffer();
sb.append(a);
sb.append(b);
sb.append(c);
sb.append(d);
String abcd = sb.toString(); //toString方法得到sb的值
System.out.println(abcd);
}
}
那么StringBuffer和StringBuilder的区别是什么呢?我们看源码:
StringBuffer中的toString方法如下:
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
使用了synchronized关键字,它是线程安全的;
StringBuilder中的toString方法如下:
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
它不是线程安全的,所以当涉及到线程安全的问题时,应该使用StringBuffer。