我运行以下代码并获得评论中显示的结果.我知道之间的差异==
和.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':
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."":()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
并且第二个字符串连接的输出:
我对这个"代码"并不熟悉,也看不出存在这些差异的原因.那么有人能解释为什么会出现这些差异吗
相关文章
"问题"只是编译器太聪明了.当它看到"abc" + "de"
它立即连接到文字"abcde".但是当它发现"abc" + de
不允许(根据Java规则)将其"优化"为文字而必须实现该+
函数时,创建一个新的String对象.
字符串文字总是作为实习字符串处理,因此==
将对它们起作用.