2015-05-15 60 views
1
String s1 = "learn"; 
String s1 = s1+"Java"; 

現在s1指向"learnJava"字符串是否正確?兩個字符串應該相等嗎?

String s2 = "learnJava"; 

if(s1 == s2)是錯誤的。爲什麼?

s2應指向與已存在於StringConstantPool(s1)中相同的"learnJava"

+6

你爲什麼改變問題的琴絃?這立即使我的答案沒有用,但並沒有讓你的問題更好... –

+0

非常感謝你回答喬恩。其實我想編輯字符串文字,我編輯它而沒有看到你的答案。 –

回答

11

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 

雖然在一般,只是不要將字符串與==比較......這幾乎總是一個壞主意。

+0

所以在這種情況下's1'不是指字符串池。 's2'是指字符串池嗎? – hitz

+0

@hitz:'s1'的* first *值是對池中一個入口的引用 - 但是第二個不是,因爲它是串聯的結果。但是,在所有這些情況下's2'指向字符串池中的一個值,因爲它是用編譯時常量表達式初始化的。 –

+0

所以,如果我們做's1.intern();'這意味着堆中有兩個相同的字符串,其他的在池中? – codegasmer

0

這也是我想到的問題。
一個char: 'a' 是原始
一個性質:新字符( 'A')是一個對象
的字符串:! 「a」 是一個對象
之所以說 「learnJava」= 「learnJava」是他們是不同的對象。
因此,爲了檢查,如果兩個字符串相等,你要做的:

String s1 = "learnJava"; 
String s2 = "learnJava"; 
s1.equals(s2) > true 
相關問題