字符串连接的性能(Effective java)- -

转贴来自:http://anonymous.bokee.com/875294.html

字符串的连接操作符(+,string concatenations operator);如果是产生一行输出,或者是产生小的,大小固定的对象用+是很合适的,但是对于大规模的情形;因为为了连接n个字符串而重复使用字符串连接符,要求n的平方级时间。(字符串是不可变的,两个字符串被连接的时候,他们的内容都要被拷贝)

这里有个例子能说明这点:......


+-------CODE------------+
public class StringEffective
{  
    public static void main(String args[])
    {
        String s="abc";
        StringBuffer sb=new StringBuffer(100);
        int circle=100000;
        long t1=System.currentTimeMillis();
        for(int i=0;i<circle;i++)
        {
            s+="a";
        }
        long t2=System.currentTimeMillis();
        System.out.println("[String] Time: <"+(t2-t1)+">");
        t1=System.currentTimeMillis();
        for(int i=0;i<circle;i++)
        {
            sb.append("a");
        }
        t2=System.currentTimeMillis();
        System.out.println("[StringBuffer] Time: <"+(t2-t1)+">" );
    }
}
/**
 *circle=100
 *result:
 *[String] Time: <0>
 *[StringBuffer] Time: <0>
 *+---------------------------+
 *circle=1000
 *result:
 *[String] Time: <15>
 *[StringBuffer] Time: <0>
 *+---------------------------+
 *circle=10000;
 *result;
 *[String] Time: <954>
 *[StringBuffer] Time: <0>
 *+---------------------------+
 *circle=100000
 *result:
 *[String] Time: <526828>
 *[StringBuffer] Time: <15>
 */
+------------END---------------------+
第一种方法所使用的时间是指数式增长,而第二种是,使他线性增长,所以,项目足够大的话,性能的差别就更显著。需要注意的是,第二种做法事先分配了一个StringBuffer,使他足够大以便能够容纳结果字符串。不过即使不知道结果字符串的大小,使用一个默认的大小的StringBuffer,他仍然比第一种做法快45倍。
所以总结一些,用Joshua Bloch的话说:不要使用字符串连接操作符来合并多个字符串,除非性能无关紧要。相反,应该使用StringBuffer的append方法,或者采用其他的方案,比如使用字符数组,或者每次只处理一个字符串,而不是把他们组合起来。

你可能感兴趣的:(java,String,Class)