2011-02-17 71 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; 
}