Java 字符串链接

Java 字符串链接
这是对 《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高。

 

 

 

 

 







你可能感兴趣的:(Java 字符串链接)