Java的字符串String对象,有一个特性就是不变性,它只能被创建,而不能改变其中的值。因此,一些大量使用字符串的程序可能会出现性能瓶颈,甚至内存溢出。针对这样的问题,Java为开发者提供了相应的解决方案。
public class StringBBTest{
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个String对象。对于a、b、c、d变量,它们都是通过双引号的形式来创建的String对象。而abcd变量则是通过它们4者相连得到,在相连的过程中,首先执行a+b的操作,产生了ab字符串,然后再加上c,又产生了abc字符串,最后加上d才得到abcd的String对象。
由以上的示例可以看出,通过String直接相加来拼接字符串的效率是很低的,其中可能会产生多余的String对象,例如ab,abc。如果程序中需要拼接的字符串数量成千上万,那么JVM的负荷是相当大的,严重影响到程序的性能。其实,如果有大量的字符串需要拼接的话,应该使用StringBuffer和StringBuilder类,它们是对String的一种补充。例如,同样的功能,可以这样来写代码以提高程序性能,示例如下:
public class StringBBTest{
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();
System.out.println(abcd);
}
}
上例是通过StringBuffer来拼接字符串的,它无法保证线程的安全。如果在拼接字符串的过程中可能会涉及到线程安全的问题,则应该使用StringBuilder,它们两者的功能和API是类似的。
在Java程序中,如果有大量拼接字符串的话,应该使用StringBuffer和StringBuilder类,它们可以避免不必要的String对象的 产生,以提高程序的性能。它们两者的作用类似,只不过StringBuilder线程是安全的。