我运行以下代码并得到评论中显示的结果。我知道 ==
和 .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");
在尝试对此进行调试时,我使用了 javap -c 命令并获得了第一个字符串连接的以下输出“代码”:
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
第二个字符串连接的输出:
我不太熟悉这个“代码”,也看不出存在这些差异的任何原因。那么谁能解释为什么会出现这些差异?
相关post
最佳答案
“问题”只是编译器对你来说太聪明了。当它看到 "abc"+ "de"
时,它会立即将其连接成文字 "abcde"。但是当它看到 "abc"+ de
时,不允许(根据 Java 规则)将其“优化”为文字,而是必须实现 +
函数,创建一个新的字符串对象。
字符串字面量总是作为驻留字符串处理,因此 ==
将对它们起作用。
关于java - Java 中 "abc"+ "de"和 "abc"+ de (de = "de") 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24364465/