Java的字符串String對(duì)象雁芙,有一個(gè)特性就是不變性轧膘,它只能被創(chuàng)建,而不能改變其中的值兔甘。因此谎碍,一些大量使用字符串的程序可能會(huì)出現(xiàn)性能瓶頸,甚至內(nèi)存溢出洞焙。針對(duì)這樣的問(wèn)題蟆淀,Java為開(kāi)發(fā)者提供了相應(yīng)的解決方案太援。
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;
? ? }
}
????????以上代碼中,一共創(chuàng)建了7個(gè)String對(duì)象扳碍。對(duì)于a、b仙蛉、c笋敞、d變量,它們都是通過(guò)雙引號(hào)的形式來(lái)創(chuàng)建的String對(duì)象荠瘪。而abcd變量則是通過(guò)它們4者相連得到夯巷,在相連的過(guò)程中,首先執(zhí)行a+b的操作哀墓,產(chǎn)生了ab字符串趁餐,然后再加上c,又產(chǎn)生了abc字符串篮绰,最后加上d才得到abcd的String對(duì)象后雷。
????????由以上的示例可以看出,通過(guò)String直接相加來(lái)拼接字符串的效率是很低的吠各,其中可能會(huì)產(chǎn)生多余的String對(duì)象臀突,例如ab,abc贾漏。如果程序中需要拼接的字符串?dāng)?shù)量成千上萬(wàn)候学,那么JVM的負(fù)荷是相當(dāng)大的,嚴(yán)重影響到程序的性能纵散。其實(shí)梳码,如果有大量的字符串需要拼接的話,應(yīng)該使用StringBuffer和StringBuilder類伍掀,它們是對(duì)String的一種補(bǔ)充掰茶。例如,同樣的功能硕盹,可以這樣來(lái)寫(xiě)代碼以提高程序性能符匾,示例如下:
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);
? ? }
}
????????上例是通過(guò)StringBuffer來(lái)拼接字符串的,它無(wú)法保證線程的安全瘩例。如果在拼接字符串的過(guò)程中可能會(huì)涉及到線程安全的問(wèn)題啊胶,則應(yīng)該使用StringBuilder,它們兩者的功能和API是類似的垛贤。
在Java程序中焰坪,如果有大量拼接字符串的話,應(yīng)該使用StringBuffer和StringBuilder類聘惦,它們可以避免不必要的String對(duì)象的 產(chǎn)生某饰,以提高程序的性能。它們兩者的作用類似,只不過(guò)StringBuilder線程是安全的黔漂。