2010-11-23 67 views
3

可能重複:
String equality vs equality of location==不是預期的?

我只是得到我的第一個評估課程回來的97.14%大關,並評論「比較字符串時,您需要使用.equals( )String ==的方法不能按照你期望的方式工作。「

字符串是如何不同的,如果是這種情況,爲什麼我的測試都能正常工作?

+0

感謝大家的回答,現在一切都變得有意義了:) – 2010-11-23 19:19:20

回答

14

你很幸運。 「==」將這兩個對象進行比較,以查看它們引用的內存地址。它與字符串中的實際內容無關。

正如下面的註釋所指出的那樣,如果您要比較兩個字符串常量,它們可能(將?)最終在同一個內存位置。所以

String a = "abc"; 
String b = "abc"; 

在這種情況下,(a == b)將返回true。不過,如果你強迫他們到不同的存儲位置與

String a = new String("abc"); 
String b = new String("abc"); 

然後(a == b)不會返回true。

+6

注意:當前的javac目前正在實施字符串,因此:``foo「==」foo「`總是如此。 (這可能是JLS的一部分,我不知道)然而,正如Paul指出的那樣,這是因爲在上面的例子中只有一個「foo」字符串,並且一個對象本身總是「==」。另一方面,這永遠不會是真的:`new String(「foo」)==「foo」`。所以 - Java 101:你總是希望用equals來比較非原始對象值。和`==`檢查*對象標識*。 (我認爲42 == 42是檢查身份以及...) – 2010-11-23 19:05:52

+3

@pst:是的,這是作爲JLS的一部分保證的。 – 2010-11-23 19:07:38

+1

第二句話是不正確的。 ==運算符不會比較兩個對象。它的操作數是對象的引用,==檢查引用是否相等 - 它們指向相同的對象。 – 2010-11-23 19:24:26

2

==運營商如果Java的參照進行比較,而不是價值。更準確地說,它通過值來比較兩個字符串引用,但不會將引用的對象與內容進行比較。

請參閱this article瞭解更多信息。

1
class test{ 
public static void main(String[] args) 
{ 
String a =new String("ABC"); 
String b =new String("ABC"); 
System.out.println(a==b); //prints False 
System.out.println(a.equals(b)); //prints true 
} 
} 
1

在Java中,有兩種不同的類型:基元和對象引用。

基元包括整數,浮點數等,並按您的預期工作。使用對象引用時,當您使用==時,它會測試引用是否相等,而不是這些引用指向的對象是否相等。

字符串不是原語,它是一個對象;因此==會測試引用相等。您需要測試equals()方法以測試對象值的相等性。你可以看到,在這個意義上,Java不是一個純粹的面向對象的語言,你有變量,而不是對象。例如,因爲整數是基元,所以它們沒有方法,所以你不能做像3.add(4)這樣的事情。有時候,你需要使用整數來創建一個對象,也就是當像Integer這樣的包裝類進來時。在某些情況下,轉換是自動的,這稱爲autoboxing。例如,當您將一個int放入ArrayList時,自動裝箱會將int轉換爲一個對象,因爲ArrayList只接受對象;此轉換必須在Java 5之前手動完成。

1

它不僅適用於字符串,還適用於所有對象。運算符==比較引用,而equals()方法應比較對象內容。僅供參考,對象相同。

順便說一句,它也與其他語言有關。 Java中的引用就像C中的指針。因此,相同的比較規則也與C相關。

你很幸運,你有97我把你25. 27.最大:)

0

==比較對象引用如果兩個對象指向同一個實際的存儲位置,以便將返回true。

equals(Object)默認情況下(在Object類中)只是調用==,但通常會被覆蓋以測試兩個對象是否具有相同的內容。

對於String類,還有一個額外的摺痕,因爲編譯器(也可能是JVM)通常會試圖確保兩個分配了相同文字字符串值的String引用指向同一個String對象。

所以:

String a = "xxx"; 
String b = "xxx"; 

System.out.println(a == b); // usually "true" 

上面的代碼通常是因爲編譯器只存儲一個"xxx"文字和ab都是指它打印「真」。如果ab是在完全分開的類中定義的,但我現在正在猜測,這可能是真的。

0

這裏是解釋差異的最佳方式:

String a = new String("foo"); 
String b = new String("foo"); 

if(a == b) { 
    // Does not execute 
} 

if(a.equals(b)) { 
    // Executes 
} 

// Now make a reference the same memory location as b 
a = b; 

if(a == b && a.equals(b)) { 
    // Executes 
} 

因爲這是你的第一個任務,它不會讓我感到吃驚,你沒有得到這個權利。當他們第一次學習編碼時,很多人都會被絆倒。試着用這種方式考慮它......

比較完全相同的東西時,「==」是真實的。想象一下,你父親的名字是鮑勃。當你稱他爲「父親」或其他人稱他爲「鮑勃」時,你都指的是同一個人。這就是「==」用於[So Bob == father]的原因。

「.equals」在比較相似對象時爲真。所以,如果你剛買了一輛2008款本田雅閣,而你的朋友剛買了一輛2008款本田雅閣,那麼你會說你們倆都有同款車。儘管如此,他們並不是同一輛車[So yourCar.equals(yourFriendsCar)]。儘管這個變化很大,因爲它是程序員決定什麼使兩個對象相同。