Java compiler(javac
)將您的code in Java轉換爲byte code,由JVM執行。 它也爲你做了一些優化。你可以用-c
參數查詢使用javap
工具生成的字節碼
級聯有最後絃樂
c==a
是真實的,因爲c
是final
下面是該段的字節碼(去年相比只):
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String Hello
2: astore_2
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_2
7: ldc #2; //String Hello
9: if_acmpne 16
12: iconst_1
13: goto 17
16: iconst_0
17: invokevirtual #4; //Method java/io/PrintStream.println:(Z)V
20: return
}
正如你所看到的,java編譯器已經將「Hel」與「lo」合併在一起,只是比較兩個字符串leterals「Hello」。Java的默認實習生字符串文字 - 這就是爲什麼它返回true
級聯與非最後絃樂
如果你是串聯字符串字面量非最終字符串變量,字節碼會有所不同:
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String lo
2: astore_1
3: ldc #3; //String Hello
5: astore_2
6: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
9: aload_2
10: new #5; //class java/lang/StringBuilder
13: dup
14: invokespecial #6; //Method java/lang/StringBuilder."<init>":()V
17: ldc #7; //String Hel
19: invokevirtual #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: aload_1
23: invokevirtual #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26: invokevirtual #9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
29: if_acmpne 36
32: iconst_1
33: goto 37
36: iconst_0
37: invokevirtual #10; //Method java/io/PrintStream.println:(Z)V
40: return
}
在這裏,我們比較java/lang/StringBuilder.toString:()Ljava/lang/String;
方法,這顯然返回另一個對象的結果 - 它等於「你好」的值,但不會被引用
即使您正在使用intern()
方法你可以找到在這個stackoverflow question
我認爲最後四個都應該是假的。讓我試試這個例子。 – markspace
你試過等於() –
我遇到了類似的問題,雖然它被回答,但也有人建議,除非有必要,它通常不值得實習字符串。 –