2014-03-07 56 views
0

我知道我們不應該比較字符串==和它更好地使用等於。
迄今爲止,我知道這應該都是錯誤的。
那麼爲什麼第一個方法返回true?與字符串比較奇怪的影響與==

private String ab = "AB"; 
private String ab2 = "A" + "B"; 
private String a = "A"; 
private String b = "B"; 
private String ab3 = a + b; 

public void test() { 
    System.out.println("ab == ab2" + ab==ab2); 
    System.out.println("ab == ab3" + ab==ab3); 
    System.out.println("ab == a+b" + ab==(a+b)); 
} 
+4

「到目前爲止,我知道這應該都是錯誤的。」不。由於字符串文字interning ... –

+0

這就是爲什麼我把目前爲止,我們一直在學習;)(和一些前輩在這裏不知道它) – chillworld

回答

5

因爲字面String S的級聯被編譯成一個單一的String,這也將在String池實習。此代碼:

private String ab2 = "A" + "B"; 

被編譯成

private String ab2 = "AB"; 

abab2指向相同的文字串"AB",因此他們==秒。

不過,你不應該==信任的String小號比較,你應該總是比較使用equals方法的平等。

+0

就像我在我的第一句話中說,我們不應該比較==但等於。 – chillworld

+0

@chillworld是的,但是這一行是爲未來的讀者發佈的,它不會讀取所有的問題,並會直接進入代碼。 –

+0

oke np;)和thx的解釋。 – chillworld

0

這就是所謂的字符串實習:

http://en.wikipedia.org/wiki/String_interning

總之,因爲字符串是在Java中不可變的,JVM優化創造了兩個字符串字面量是相等只有一個對象。因此,比較返回true。

+0

你的回答建議JVM爲* all *字符串做 - 這是不真實的。我建議你澄清你的答案。 –

+0

感謝喬恩,我糾正強調它確實爲字符串文字優化。 – Selcuk