String s1 = "learn";
String s1 = s1+"Java";
現在s1指向"learnJava"
字符串是否正確?兩個字符串應該相等嗎?
String s2 = "learnJava";
if(s1 == s2)
是錯誤的。爲什麼?
s2
應指向與已存在於StringConstantPool(s1)中相同的"learnJava"
。
String s1 = "learn";
String s1 = s1+"Java";
現在s1指向"learnJava"
字符串是否正確?兩個字符串應該相等嗎?
String s2 = "learnJava";
if(s1 == s2)
是錯誤的。爲什麼?
s2
應指向與已存在於StringConstantPool(s1)中相同的"learnJava"
。
s2應指向與StringConstantPool中已存在的相同的「learnJava」。
都能跟得上 - 字符串池中僅用於不斷字符串,除非你叫intern
。
因此字符串池包含"learn"
,"Java"
和"learnJava"
...但s1
指串字符串池中沒有,因爲串接在執行時進行。
如果你有一個編譯時間常數表達式,這將是不同的:
String s1 = "learn" + "Java"; // Constant expression
String s2 = "learnJava";
System.out.println(s1 == s2); // true, guaranteed
或者,如果你想保持你的執行時間串聯:
String s1 = "learn";
s1 += "Java";
s1 = s1.intern();
String s2 = "learnJava";
System.out.println(s1 == s2); // true
雖然在一般,只是不要將字符串與==
比較......這幾乎總是一個壞主意。
所以在這種情況下's1'不是指字符串池。 's2'是指字符串池嗎? – hitz
@hitz:'s1'的* first *值是對池中一個入口的引用 - 但是第二個不是,因爲它是串聯的結果。但是,在所有這些情況下's2'指向字符串池中的一個值,因爲它是用編譯時常量表達式初始化的。 –
所以,如果我們做's1.intern();'這意味着堆中有兩個相同的字符串,其他的在池中? – codegasmer
這也是我想到的問題。
一個char: 'a' 是原始
一個性質:新字符( 'A')是一個對象
的字符串:! 「a」 是一個對象
之所以說 「learnJava」= 「learnJava」是他們是不同的對象。
因此,爲了檢查,如果兩個字符串相等,你要做的:
String s1 = "learnJava";
String s2 = "learnJava";
s1.equals(s2) > true
你爲什麼改變問題的琴絃?這立即使我的答案沒有用,但並沒有讓你的問題更好... –
非常感謝你回答喬恩。其實我想編輯字符串文字,我編輯它而沒有看到你的答案。 –