Java中"abc"+"de"和"abc"+ de(de ="de")之间的区别?

Ton*_*ony 5 java string

我运行以下代码并获得评论中显示的结果.我知道之间的差异==.equals().我不明白的是为什么我的第二行代码与第三行代码的结果不同.

    String de = "de";
//  String abcde = "abc" + "de"; // abcde == "abcde" reture true
    String abcde = "abc" + de;   // abcde == "abcde" reture false;
    System.out.println();
    System.out.println(abcde=="abcde");
    System.out.println(de=="de");
Run Code Online (Sandbox Code Playgroud)

在尝试调试时,我使用了javap -c命令并为第一个字符串连接获得了以下输出'code':

         Code:
 0:   ldc     #9; //String de
 2:   astore_1
 3:   new     #10; //class java/lang/StringBuilder
 6:   dup
 7:   invokespecial   #11; //Method java/lang/StringBuilder."<init>":()V
 10:  ldc     #4; //String abc
 12:  invokevirtual   #12; //Method java/lang/StringBuilder.append:(Ljava/lang
 String;)Ljava/lang/StringBuilder;
 15:  aload_1
 16:  invokevirtual   #12; //Method java/lang/StringBuilder.append:(Ljava/lang
 String;)Ljava/lang/StringBuilder;
   19:  invokevirtual   #13; //Method java/lang/StringBuilder.toString:()Ljava/l
 ng/String;
   22:  astore_2
   23:  getstatic       #14; //Field java/lang/System.out:Ljava/io/PrintStream;
   26:  invokevirtual   #15; //Method java/io/PrintStream.println:()V
   29:  getstatic       #14; //Field java/lang/System.out:Ljava/io/PrintStream;
   32:  aload_2
   33:  ldc     #16; //String abcde
   35:  if_acmpne       42
   38:  iconst_1
   39:  goto    43
   42:  iconst_0
   43:  invokevirtual   #17; //Method java/io/PrintStream.println:(Z)V
   46:  getstatic       #14; //Field java/lang/System.out:Ljava/io/PrintStream;
   49:  aload_1
   50:  ldc     #9; //String de
   52:  if_acmpne       59
   55:  iconst_1
   56:  goto    60
   59:  iconst_0
   60:  invokevirtual   #17; //Method java/io/PrintStream.println:(Z)V
   63:  return
Run Code Online (Sandbox Code Playgroud)

并且第二个字符串连接的输出:

我对这个"代码"并不熟悉,也看不出存在这些差异的原因.那么有人能解释为什么会出现这些差异吗

相关文章

Hot*_*cks 12

"问题"只是编译器太聪明了.当它看到"abc" + "de"它立即连接到文字"abcde".但是当它发现"abc" + de不允许(根据Java规则)将其"优化"为文字而必须实现该+函数时,创建一个新的String对象.

字符串文字总是作为实习字符串处理,因此==将对它们起作用.

  • @Tony - 编译器的设计使得`String a ="abc"+"de";`这样的语句将被编译为`String a ="abcde";`.这是设计的,允许多行字符串文字与`+`和其他类似的东西结合. (3认同)