该特定示例将由编译器内联:
String a = "a";String b = "bb";String c = "ccc";String some = a + "t" + b + "t" + c;
Java
9+将使用带有makeConcatWithConstants的invokedynamic来内联此代码,以使其高效。根据
javap -v输出:
Code: stack=3, locals=5, args_size=1 0: ldc#2 // String a 2: astore_1 3: ldc#3 // String bb 5: astore_2 6: ldc#4 // String ccc 8: astore_3 9: aload_1 10: aload_2 11: aload_3 12: invokedynamic #5, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 17: astore 4 19: return
但是,如果
a
band
c是编译时间常数,则编译器将进一步优化代码:
final String a = "a";final String b = "bb";final String c = "ccc";String some = a + "t" + b + "t" + c;
并将
some加载一个常量值:
Code: stack=1, locals=5, args_size=1 0: ldc#2 // String a 2: astore_1 3: ldc#3 // String bb 5: astore_2 6: ldc#4 // String ccc 8: astore_3 9: ldc#5 // String atbbtccc 11: astore 4 13: return
在其他情况下,例如
for循环,编译器可能无法生成优化的代码,因此
StringBuilder可能会更快。



