2011-02-17 70 views

回答

2

標準的Java編譯器對發出的字節碼沒有做任何優化。我認爲推理是未優化的字節碼對於HotSpot JIT編譯器來說更容易優化。

@Mitch Wheat在上述註釋中提供的鏈接(特別是第二個)來自HotSpot JIT是新技術的日子。

0

在搜索所有源代碼優化時,我遇到了這個問題,儘管我在很長時間後回答了這個問題。

jdk1.7後,用加[+]操作者字符串連接轉換爲StringBuilder的追加例如追加如圖字節碼

public static void main(String[] args) { 
String s = new String(""); 
s = s+"new"; 
} 

轉換爲StringBuilder的

public static void main(java.lang.String[]); 
    descriptor: ([Ljava/lang/String;)V 
    flags: ACC_PUBLIC, ACC_STATIC 
    Code: 
     stack=3, locals=2, args_size=1 
     0: new   #2     // class java/lang/String 
     3: dup 
     4: ldc   #3     // String 
     6: invokespecial #4     // Method java/lang/String."<init>":(Ljava/lang/String;)V 
     9: astore_1 
     10: new   #5     // class java/lang/StringBuilder 
     13: dup 
     14: invokespecial #6     // Method java/lang/StringBuilder."<init>":()V 
     17: aload_1 
     18: invokevirtual #7     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     21: ldc   #8     // String new 
     23: invokevirtual #7     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     26: invokevirtual #9     // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
     29: astore_1 
     30: return 
     LineNumberTable: 
     line 13: 0 
     line 14: 10 
     line 15: 30 
     LocalVariableTable: 
     Start Length Slot Name Signature 
      0  31  0 args [Ljava/lang/String; 
      10  21  1  s Ljava/lang/String; 
}