字符串连接的性能(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方法,或者采用其他的方案,比如使用字符数组,或者每次只处理一个字符串,而不是把他们组合起来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值