2012-05-23 28 views
1

可能重複:
Comparing two strings with 「==」: when will it work?不同的方法來比較字符串

我有以下代碼:

String s1 = new String("Test"); 
String s2 = new String("Test"); 

String s3 = "Test"; 
String s4 = "Test"; 

System.out.println(s1 == s2); 
System.out.println(s3 == s4); 

而且我得到以下輸出:

false 
true 

爲什麼第二次比較打印true

+9

可能的重複:[比較兩個字符串與「==」:什麼時候可以工作?](http://stackoverflow.com/q/7479334/844882) –

+0

它是相同的問題,但答案有超級令人困惑 - 在這裏做另一個更簡單的答案是有意義的嗎? – mfrankli

+0

@mfrankli我不會稱呼一個非常精確和深入的答案,至少不是沒有資格。我承認,這可能對於初學者來說太過先進。 –

回答

5

來比較String是用正確的方法,

s1.equals(s2) 
  1. System.out.println(s1==s2)打印false,因爲s1s2都指向堆上不同的對象。

  2. System.out.println(s3==s4)打印true,因爲s3s4是其指向在堆上相同的對象的對象的引用。

+2

這是不正確的。 's3'和's4'與's1'和's2'在同一個堆上不是**。它們都指向**字符串文字池**中的一個String常量。 –

+0

我從來沒有說過s3和s4在堆上,請再讀一遍,我說他們指向堆上的同一個對象...... –

+0

通常,「堆」是指更普遍的堆負責使用'new'運算符分配的動態內存。在我的回答中,我會提到字符串文字池或字符串內部化,只是爲了儘可能清楚:)。 –

3

不知道它回答了這個問題,但是:

==用於比較的基準(指針)

所以s1==s2不檢查字符串是相同的,但如果s1和s2是相同的String實例。

要檢查平等,你必須使用equals功能:s1.equals(s2)

由於串內化,行爲取決於JVM和無法預測的(即使大多數的實現是相同的)

+1

可以預測,如果你知道你正在使用哪個JVM版本...... –

+0

當然,最後一句沒有隱含的「除非你知道只有一個JVM實現將被使用」......然而,最佳實踐不會依賴在一個具體的實施... – Vinze

+0

嗯...你是關於這個?字符串實習可以(通常會)顯着提高效率和內存使用率。我無法想象一個不會自動實習字符串的JVM ... –

2

在Java中,這是需要注意的重要,==始終表示「返回true,如果這兩個東西是指一個對象在內存的同一個實例」

當你使用構造聲明的字符串:

String s1 = new String("Foo"); 
String s2 = new String("Foo"); 

一個新的字符串實例總是創建。這意味着即使它們具有相同的值,s1s2也不會是同一個對象,因此==將返回false。

然而,對於常量字符串還有一個特例。當你聲明這樣的字符串:

String s3 = "Foo"; 
String s4 = "Foo"; 

然後一個常量字符串在字符串池中創建的,並且這兩個變量S3和S4指向它作爲一個內存優化。這應該被視爲實現細節。比較仍應始終使用Equals方法完成。

+0

正確的答案+1 –