2011-08-04 64 views
-3

可能重複:
Java String.equals versus ==比較Java字符串用==

是否有可能使用==操作符來比較Java字符串?

爲什麼我經常看到用equals()方法代替?

是因爲當與字面字符串(如「你好」)比較使用==並不意味着調用equals()?

+5

http://stackoverflow.com/questions/767372/java-string-equals-versus – Johan

+0

只要注意,有時==可能成功爲兩個不同的字符串變量,這是因爲實習方法導致他們都參考相同的實際對象的內存。 – Steven

+1

如果你的谷歌「java字符串比較」,你會發現任何數量的明確解釋,包括在這個網站上的一些。 – NPE

回答

5

沒有定製運營商在java中過載。 [所以不能過載它來調用的equals()]

了equals()確保你檢查2個對象是相同的,而==檢查這是否是完全相同的對象。 [所以不,使用==不會調用equals()]。

+0

有沒有**自定義**運算符重載。 Java語言重載了一些運算符('+'可以表示數字加法或字符串連接,'|'可以表示按位OR或邏輯非快捷鍵OR)。 –

+0

@Joachim:同意,我認爲OP對自定義運算符重載感興趣,所以我沒有明確提及它。感謝您的評論。我編輯了我的答案。 – amit

2

==檢查兩個對象是否引用同一個對象實例,而equals()檢查這兩個對象是否實際上等價,即使它們不是相同的實例。

2

不,這是不可能的,因爲==你比較對象引用,而不是字符串(您需要使用等於)的內容。

1

要在@ Amit的答案擴大,操作符==只應在值類型(int,double等)的字符串是一個引用類型,因此,應與.equals()方法相比,使用。在引用類型檢查在Java引用平等使用==操作符(意思是兩個對象引用指向同一個內存位置。)

1

String是一個class.So如果您嘗試比較其對象的字符串抱着你不能使用==,因爲它是尋找一個object.For比較,你必須使用對象的內容的字符串值等於

1

==操作符比較字符串對象引用,而String.equals方法檢查用於對象引用+對象值。而且,String.equals方法inturn在其實現中使用==運算符。

1

從我所知道的'=='運算符是用來檢查對象是否相同。
可能的比較字符串可能具有相同的值(字符等),但事實上是兩個完全不同的對象,因此會導致比較錯誤。

2

在Java中,您不能重載運算符。 ==運算符確保身份相等。另一方面,equals(...)方法可以被覆蓋以進行類型特定的比較。

這裏的代碼片段演示:

String a = "abcdef"; 
String b = a; 
String c = new String(a); 

println(a == b); // true 
println(a.equals(b)); // true 

println(a == c); // false 
println(a.equals(c)); // true 

的一個複雜因素是你需要關心空,也equals(...)。所以,正確的空安全的成語是:

(a == null ? b == null : a.equals(b)) 

這是一個循環,你不必通過跳躍中說C#

0

正如阿米特已經說過,==檢查是相同的對象,而equals()檢查相同的內容(好的,基本實現等於==,但String覆蓋此內容)。

注:

"Hello" == "Hello" //most probably would be true 
"Hello".equals("Hello") //will be true 

String s1, s2; //initialize with something different than a literal, e.g. loading from a file, both should contain the same string 
s1 == s2 //most probably will NOT be true 
s1.equals(s2) //will be true, if both contain the same string, e.g. "Hello" 

除此之外,同樣適用於原語的對象封裝,例如真

Long l1 = 1L; 
Long l2 = 1L; 
l1 == l2 //will most likely be true for small numbers, since those literals map to cached instances 
l1.equals(l2) //will be true 

new Long(1) == new Long(1) //will NOT be true 
new Long(1).equals(new Long(1)) //will be true 
+0

-1:'1L'是原始'long',1L.equals(1L)是無效的Java語法(對基本類型的方法調用沒有裝箱)[好吧,如果我達到125的聲望,我會投下它:P] – pmnt

+0

@pmnt你是對的,更新了答案。 – Thomas

1

==如果內存地址在兩側都相等,除基本類型外,則返回true。

等於應該用在不是原語的所有東西上。主要部分的類。

0

==運算符檢查對象的位模式而不是這些對象的內容,但等於函數比較對象的內容。

String str1=new String("abc"); 
String str2=new String("abc"); 

System.out.println(str1 == str2);將返回false,因爲str1和str2是用「new」創建的不同對象。 System.out.println(str1.equals(str2))將返回true,因爲equals()會檢查對象的內容。