这是对 《Effective Java》 38条的一个摘要:
public String statement1(){
String s ="";
for(int i=0; i < numItems(); i++){
s += lineForItem(i);
}
return s;
}
public String statement2(){
StringBuffer s = new StringBuffer(numItems()*LINE_WIDTH);
for(int i=0; i < numItems(); i++){
s.append(lineForItem(i));
}
return s.toString();
}
方法2的效率要比方法1的效率高。
原则很简单: 不要使用 字符串链接操作符来合并多个字符串,除非性能无关紧要。相反,应该使用StringBuffer的append方法,或者采用其它的方案,比如使用字符数组,或者每次只处理一个字符串,而不是将它们组合起来。
Tip1 初始化 StringBuffer 时,可以使用带长度参数的构造函数尽量使用带长度参数的构造函数。这样预先计算了总长度,消除了内存重分配。
Tip2 JDK 的自动优化
public static String concat4(String s1, String s2, String s3, String s4, String s5, String s6) {
return s1 + s2 + s3 + s4 + s5 + s6;
}
上面这段代码执行的时候,Java会自动使用StringBuilder.append()函数来进行连接。所以这时,使用字符串连接符反而很快,甚至比使用 StringBuffer 还快。
Tip 3 需要线程安全的地方使用 StringBuffer,不需要线程安全的地方使用 StringBuilder
。 String类是不可变类,任何对String的改变都会引发新的String对象的生成;而StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。当改变字符串内容时,采用StringBuffer能获得更好的性能。既然是为了获得更好的性能,那么采用 StringBuffer能够获得最好的性能吗?答案是NO!为什么?如果你读过《Think in Java》,而且对里面描述HashTable和HashMap区别的那部分章节比较熟悉的话,你一定也明白了原因所在。对,就是支持线程同步保证线程安全而导致性能下降的问题。HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也在于此,新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。
posted on 2010-02-10 18:46
lincode 阅读(404)
评论(0) 编辑 收藏 所属分类:
Java