2011-03-12 89 views
1

我正在使用JSP中的Java代碼,我試圖比較字符串,並且遇到問題。Java中的字符串比較

我宣佈兩個字符串

s1 = "din"; 
s2 = "din"; 

然而,if (s1 == s2)永遠不會執行。有人能幫我嗎?

+3

請顯示您的實際代碼。你在使用scriptlets嗎? (請不要) – 2011-03-12 23:31:31

+3

在一些JVM上,這實際上會工作,因爲他們實習所有字符串常量。 – Neil 2011-03-12 23:44:36

+1

您應該使用.equals比較平等(如其他人所述)。但是,請注意,在給出的例子中(s1 == s2)通常會等於true,因爲字符串文字將被實現(s1和s2將引用同一個對象) – Neil 2011-03-12 23:44:52

回答

4

你用 '等於',當你比較字符串。

if(s1.equals(s2)) { true }

+3

s1將**總是**等於s1 – 2011-03-12 23:33:54

+0

是的,抱歉關於錯字。 – heldt 2011-03-12 23:38:53

+0

這是我得到java.lang.NullPointerException的異常,當我使用等於 – pa12 2011-03-12 23:45:25

11

運算符==用於比較字符串是否相等,而不是值相等。

嘗試調用equals而不是使用==

if (s1.equals(s2)) { ... } 
2

你到底想達到什麼目的?

比較字符串或它們的值? 如果你期待,你(如果)條件應該返回true,則使用

s1.equals(s2); 
5

比較字符串時,你應該始終使用equals方法,而不是==:

if(str1.equals(str2)) 

...會正確的做事方式。

在哪裏產生了困惑就像是以下情況:

String str1 = "hello"; 
String str2 = "hello"; 
System.out.println(str1==str2); 

以上將實際打印出真實的。但是,除了上述的學術目的外,您不應該使用它。如果你正在使用==,你正在檢查這些值是否是堆中物理上相同的對象。如果你使用.equals(),你會檢查它們是否有意義的相等,即使它們實際上是兩個單獨的對象。 有時候,特別是像上面那樣涉及文字時(或者當您手動調用intern()方法時),出於性能原因,Java會自動使兩個單獨的字符串對象指向同一個對象。然而,沒有合理的保證會發生(除非你想打擾自己的JLS的明確細節,即使如此,它只是有保證),大多數情況下不會。以下例如:

String str1 = "hello"; 
String str2 = "he"; 
str2 += "llo"; 
System.out.println(str1 == str2); 

現在它打印錯誤,因爲儘管有意義相等,我們還沒有達到Java以前提供的相同的優化。

在上述兩種情況下,使用equals()將返回true。

+0

在Java語言規範中,當字符串是相同的對象時有一些保證,但是你是對的,總是更好地使用'equals'。 – 2011-03-13 01:33:24

+0

@PaŭloEbermann好點 - 我的意思是從邏輯的角度來看更多,而不是瞭解JLS的細節。 – berry120 2011-03-13 01:34:55