关于String与StringBuffer的.

来源:互联网 发布:棋牌游戏源码修改软件 编辑:程序博客网 时间:2024/05/21 18:29

都说StringBuffer比String效率高.所以详细看看!

其结论为:      至于推荐用StringBuffer来代替String+拼装字符串,说的是循环方式下

  1. public   class   Bigint   {   
  2.     public   static   void   main(String[]   args)   {   
  3.             String   a   =   "a";   
  4.             String   b   =   "b";   
  5.             String   c   =   "c";   
  6.             String   s   =   a   +   b   +   c;   
  7.     }   
  8. }

生成如下byteCode:

// Compiled from Bigint.java (version 1.5 : 49.0, super bit)
public class com.kinghi.xlink.test.Bigint {
 
  // Method descriptor #6 ()V
  // Stack: 1, Locals: 1
  public Bigint();
    0  aload_0 [this]
    1  invokespecial java.lang.Object() [8]
    4  return
      Line numbers:
        [pc: 0, line: 5]
      Local variable table:
        [pc: 0, pc: 5] local: this index: 0 type: com.kinghi.xlink.test.Bigint
 
  // Method descriptor #15 ([Ljava/lang/String;)V
  // Stack: 3, Locals: 5
  public static void main(java.lang.String[] args);
     0  ldc <String "a"> [16]
     2  astore_1 [a]
     3  ldc <String "b"> [18]
     5  astore_2 [b]
     6  ldc <String "c"> [20]
     8  astore_3 [c]
     9  new java.lang.StringBuilder [22]
    12  dup
    13  aload_1 [a]
    14  invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [24]
    17  invokespecial java.lang.StringBuilder(java.lang.String) [30]
    20  aload_2 [b]
    21  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [33]
    24  aload_3 [c]
    25  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [33]
    28  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [37]
    31  astore 4 [s]
    33  return
      Line numbers:
        [pc: 0, line: 7]
        [pc: 3, line: 8]
        [pc: 6, line: 9]
        [pc: 9, line: 10]
        [pc: 33, line: 11]
      Local variable table:
        [pc: 0, pc: 34] local: args index: 0 type: java.lang.String[]
        [pc: 3, pc: 34] local: a index: 1 type: java.lang.String
        [pc: 6, pc: 34] local: b index: 2 type: java.lang.String
        [pc: 9, pc: 34] local: c index: 3 type: java.lang.String
        [pc: 33, pc: 34] local: s index: 4 type: java.lang.String
}

可知其也是通过StringBuilder来相加的.

 

 

 

至于推荐用StringBuffer来代替String+拼装字符串,说的是循环方式下,如:   
    

  1.   public   class   Test4   {   
  2.           public   static   void   main(String[]   args)   {   
  3.                   String   s   =   "s";   
  4.                   for   (int   i   =   0;   i   <   20;   i++)   {   
  5.                           s   +=   i;   
  6.                   }   
  7.           }   
  8.   }   

    
  对应的bytecode为:  
   
  public   class   Test4   extends   java.lang.Object{  
  public   Test4();  
      Code:  
        0:       aload_0  
        1:       invokespecial       #1;   //Method   java/lang/Object."<init>":()V  
        4:       return  
   
  public   static   void   main(java.lang.String[]);  
      Code:  
        0:       ldc           #2;   //String   s  
        2:       astore_1  
        3:       iconst_0  
        4:       istore_2  
        5:       iload_2  
        6:       bipush     20  
        8:       if_icmpge               36  
        11:     new           #3;   //class   StringBuffer  
        14:     dup  
        15:     invokespecial       #4;   //Method   java/lang/StringBuffer."<init>":()V  
        18:     aload_1  
        19:     invokevirtual       #5;   //Method   java/lang/StringBuffer.append:(Ljava/lang/S  
  tring;)Ljava/lang/StringBuffer;  
        22:     iload_2  
        23:     invokevirtual       #6;   //Method   java/lang/StringBuffer.append:(I)Ljava/lang  
  /StringBuffer;  
        26:     invokevirtual       #7;   //Method   java/lang/StringBuffer.toString:()Ljava/lan  
  g/String;  
        29:     astore_1  
        30:     iinc         2,   1  
        33:     goto         5  
        36:     return  
   
  }  
   
  如果用String+的方式,每循环一次,就会重新new一个StringBuffer对象,这样的内存消耗完全是不必要的(在数据量大的情况下,还会导致内存不足的错误),所以要这样做:  
   
  public   class   Test5   {  
          public   static   void   main(String[]   args)   {  
                  StringBuffer   sb   =   new   StringBuffer("s");  
                  for   (int   i   =   0;   i   <   20;   i++)   {  
                          sb.append(i);  
                  }  
          }  
  }  
  这样无论循环多少次,都只会生成一个StringBuffer对象