我只是得到我的第一個評估課程回來的97.14%大關,並評論「比較字符串時,您需要使用.equals( )String ==的方法不能按照你期望的方式工作。「
字符串是如何不同的,如果是這種情況,爲什麼我的測試都能正常工作?
我只是得到我的第一個評估課程回來的97.14%大關,並評論「比較字符串時,您需要使用.equals( )String ==的方法不能按照你期望的方式工作。「
字符串是如何不同的,如果是這種情況,爲什麼我的測試都能正常工作?
你很幸運。 「==」將這兩個對象進行比較,以查看它們引用的內存地址。它與字符串中的實際內容無關。
正如下面的註釋所指出的那樣,如果您要比較兩個字符串常量,它們可能(將?)最終在同一個內存位置。所以
String a = "abc";
String b = "abc";
在這種情況下,(a == b)
將返回true。不過,如果你強迫他們到不同的存儲位置與
String a = new String("abc");
String b = new String("abc");
然後(a == b)
不會返回true。
注意:當前的javac目前正在實施字符串,因此:``foo「==」foo「`總是如此。 (這可能是JLS的一部分,我不知道)然而,正如Paul指出的那樣,這是因爲在上面的例子中只有一個「foo」字符串,並且一個對象本身總是「==」。另一方面,這永遠不會是真的:`new String(「foo」)==「foo」`。所以 - Java 101:你總是希望用equals來比較非原始對象值。和`==`檢查*對象標識*。 (我認爲42 == 42是檢查身份以及...) – 2010-11-23 19:05:52
@pst:是的,這是作爲JLS的一部分保證的。 – 2010-11-23 19:07:38
第二句話是不正確的。 ==運算符不會比較兩個對象。它的操作數是對象的引用,==檢查引用是否相等 - 它們指向相同的對象。 – 2010-11-23 19:24:26
基本上,==
進行比較,看看你的兩個變量是否是同一個對象。對於大多數字符串比較,這隻會巧合。 .equals()
函數將檢查你的兩個字符串對象的內容,並告訴你是否它們是相同的。
它的根源有兩種相等:參考和值。
閱讀所有關於它在這裏(其中許多人一樣,我敢肯定):http://leepoint.net/notes-java/data/expressions/22compareobjects.html
的==
運營商如果Java的參照進行比較,而不是價值。更準確地說,它通過值來比較兩個字符串引用,但不會將引用的對象與內容進行比較。
請參閱this article瞭解更多信息。
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
}
}
在Java中,有兩種不同的類型:基元和對象引用。
基元包括整數,浮點數等,並按您的預期工作。使用對象引用時,當您使用==時,它會測試引用是否相等,而不是這些引用指向的對象是否相等。
字符串不是原語,它是一個對象;因此==會測試引用相等。您需要測試equals()方法以測試對象值的相等性。你可以看到,在這個意義上,Java不是一個純粹的面向對象的語言,你有變量,而不是對象。例如,因爲整數是基元,所以它們沒有方法,所以你不能做像3.add(4)
這樣的事情。有時候,你需要使用整數來創建一個對象,也就是當像Integer這樣的包裝類進來時。在某些情況下,轉換是自動的,這稱爲autoboxing。例如,當您將一個int放入ArrayList時,自動裝箱會將int轉換爲一個對象,因爲ArrayList只接受對象;此轉換必須在Java 5之前手動完成。
它不僅適用於字符串,還適用於所有對象。運算符==比較引用,而equals()方法應比較對象內容。僅供參考,與對象相同。
順便說一句,它也與其他語言有關。 Java中的引用就像C中的指針。因此,相同的比較規則也與C相關。
你很幸運,你有97我把你25. 27.最大:)
==
比較對象引用如果兩個對象指向同一個實際的存儲位置,以便將返回true。
equals(Object)
默認情況下(在Object
類中)只是調用==
,但通常會被覆蓋以測試兩個對象是否具有相同的內容。
對於String類,還有一個額外的摺痕,因爲編譯器(也可能是JVM)通常會試圖確保兩個分配了相同文字字符串值的String引用指向同一個String對象。
所以:
String a = "xxx";
String b = "xxx";
System.out.println(a == b); // usually "true"
上面的代碼通常是因爲編譯器只存儲一個"xxx"
文字和a
和b
都是指它打印「真」。如果a
和b
是在完全分開的類中定義的,但我現在正在猜測,這可能是真的。
這裏是解釋差異的最佳方式:
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)]。儘管這個變化很大,因爲它是程序員決定什麼使兩個對象相同。
感謝大家的回答,現在一切都變得有意義了:) – 2010-11-23 19:19:20