概述
转贴来自: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方法,或者采用其他的方案,比如使用字符数组,或者每次只处理一个字符串,而不是把他们组合起来。
最后
以上就是平淡楼房为你收集整理的字符串连接的性能(Effective java)- -的全部内容,希望文章能够帮你解决字符串连接的性能(Effective java)- -所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复