随笔 - 35  文章 - 21  trackbacks - 0
<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

常用链接

留言簿

随笔分类

随笔档案

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜

这是对 《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

只有注册用户登录后才能发表评论。


网站导航: