我运行以下代码并获得评论中显示的结果.我知道之间的差异==和.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对象.
字符串文字总是作为实习字符串处理,因此==将对它们起作用.