Java中的字符串连接和自动装箱

rub*_*buc 5 java autoboxing concatenation

当您将String与诸如int之类的基元连接在一起时,它是否首先对该值进行自动标记.

恩.

String string = "Four" + 4;
Run Code Online (Sandbox Code Playgroud)

它如何将值转换为Java中的字符串?

ben*_*y23 5

要查看Java编译器生成的内容,使用它javap -c来显示生成的实际字节码总是很有用:

例如,以下Java代码:

String s1 = "Four" + 4;
int i = 4;
String s2 = "Four" + i;
Run Code Online (Sandbox Code Playgroud)

会产生以下字节码:

   0:   ldc     #2; //String Four4
   2:   astore_1
   3:   iconst_4
   4:   istore_2
   5:   new     #3; //class java/lang/StringBuilder
   8:   dup
   9:   invokespecial   #4; //Method java/lang/StringBuilder."<init>":()V
   12:  ldc     #5; //String Four
   14:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
   17:  iload_2
   18:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(I)Ljava/lan
g/StringBuilder;
   21:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
   24:  astore_3
   25:  return
Run Code Online (Sandbox Code Playgroud)

从中我们可以看到:

  • 在这种情况下"Four" + 4,Java编译器(我使用的是JDK 6)非常聪明地推断出这是一个常量,所以在运行时没有计算工作,因为字符串在编译时连接起来
  • 在这种情况下"Four" + i,等效代码是new StringBuilder().append("Four").append(i).toString()
  • 这里不涉及自动装箱,因为有一个StringBuilder.append(int)方法,根据文档使用String.valueOf(int)来创建整数的字符串表示.