第51条:当心字符串连接的性能
字符串连接操作符(+)是把多个字符串合并为一个字符串的便利途径。要想产生单独一行的输出,或者构造一个字符串来表示一个较小的、大小固定的对象,使用连接操作符是非常合适的,但是它不适合运用在大规模的场景中。为连接n个字符串而重复地使用字符串连接操作符,需要n的平方级的时间。这是由于字符串不可变而导致的不幸结果。当两个字符串被连接在一起时,他们的内容都要被拷贝。
public String statement(){
String result = "";
for (int i = 0; i < numItems; i++ ){
result += lineForItem(i);
return result;
}
}
如果项目数量巨大,这个方法的执行时间就难以估算。为了获得可以接受的性能,请使用StringBuffer替代String,来存储建筑中的对账单。
public String statement(){
StringBuffer sb = new StringBuffer(numItems() * LINE_WIDTH);
for (int i = 0; i < numItems(); i++ ){
sb.append(lineForItem(i));
}
return sb.toString();
}
使用StringBuffer替代String,时间复杂度n 。所以项目数越大,性能的差别会越显著。
原则很简单:不要使用字符串连接操作符来合并多个字符串,除非性能无关紧要。相反,应该使用StringBuffer的append方法。