基于接受的答案,我希望能够有一个开始来看看引擎盖下面的东西。
让我们来看一下将字符串与字符连接时生成的字节码:
String str1 = "a" + "test";
String str2 = 'a' + "test";
0: ldc
2: astore_1
3: ldc
5: astore_2
正如你所看到的,没有任何区别,编译器将把它转换为相同的字节码。
现在让我们来看一下在将字符连接到字符串变量时生成的字节码。
String str1 = "a" + str3; //str3 is a String
String str2 = 'a' + str3;
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
10: ldc #5 // String a
12: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: aload_1
16: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_2
23: new #3 // class java/lang/StringBuilder
26: dup
27: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
30: bipush 97
32: invokevirtual #8 // Method java/lang/StringBuilder.append:(C)Ljava/lang/StringBuilder;
35: aload_1
36: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
39: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
如您所见,这里有一点差别。
10: ldc #5 // String a
ldc
指令可以将常量池中的字符串、整数或浮点数值#index压入栈中。
因此,如果您直接连接一个变量,连接一个字符会生成更少的字节码,这就是底层实现。
至于性能问题,这不会产生任何显著的性能差异,因为JIT编译器优化了大多数临时对象,除非在运行程序时指定禁用JIT编译器使用-Djava.compiler=NONE
。
new File(parent, filename)
... - Axelappend('c')
应该比使用append("C")
更高效。因为StringBuilder
的内部表示使用了一个char[]
,所以如果你使用了一个String
,那么这个方法就必须进行某种类型的转换。从功能上讲,我认为这两种方法是相等的。 - riccardo.cardinstr1 + 'a' + str2
与str1 + "a" + str2
直接进行比较;这样保持概念上的一致性,避免任何人根据隐含的用法提出答案。 - anon