2012-09-22 58 views
-1

可能重複:
How do I compare strings in Java?爲什麼這個輸出比較args [0]和字符串?

當我運行下面的代碼爲 「java的XYZ BOY」 輸出爲 「無效類型」,如何?

public class XYZ 
{ 
    public static void main(String args[]) 
    { 


     if(args[0]=="BOY") 
      System.out.println("He is boy"); 

     else if(args[0]=="Girl") 
      System.out.println("She is girl"); 

     else 
     System.out.println("Invalid type"); 


    } 
} 

但是,當我使用args[0].equals("BOY")時,它會給出所需的輸出。我想知道爲什麼當我不使用String.equals()時出現問題?

+2

[如何比較Java中的字符串?](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – Baz

+0

是的,謝謝BAZ,我一直在尋找這樣的問題,但沒有通過搜索,所以發佈了新的問題 – Jignesh

+2

如果我每次問這種類型的問題都有半分錢,我會成爲一個quintillionaire。 – arshajii

回答

6

運算符==測試兩個變量是否引用了與您感興趣的內容不同的對象。相反,您想知道兩個字符串變量是否引用了以相同順序保存相同字符的字符串對象並在同樣的情況下,這是equals(...)做什麼,或無論如何,這是什麼equalsIgnoreCase(...)做什麼。

所有課程得到最終的父類,Object,如果不重寫會做同樣的事情作爲==默認equals(...)方法,如按照API:

的類對象實現equals方法對象上最可能的等價關係;也就是說,對於任何非空引用值x和y,當且僅當x和y引用同一對象(x == y的值爲true)時,此方法返回true。

許多類都會重寫此方法以使用它們自己的等式測試,這對於類是有意義的。字符串就是這樣一個類。有關String如何執行此操作的更多詳細信息,請查看其API其中的狀態:

將此字符串與指定的對象進行比較。當且僅當參數不爲null並且是表示與此對象相同字符序列的String對象時,結果爲true。

說完所有這些 - 投票結束這個問題的重複。

1

由於您正在使用==運算符,因此您會看到「無效類型」。 ==運算符用於比較具有相同值的兩個對象及其引用應該是否相同。 雖然在你的第一個條件你使用==運算符,它將返回false。 ,因爲即使值相同但對象不相同。 接下來在第二種情況下,您正在檢查BOY == GIRL,它將返回false。 因此它將打印「無效類型」,即

1

如果某些對象具有相同的內容,則認爲它們是相同的。對於這些,請使用.equals(Object)來比較對象內容。

如果某些對象是相同的實例,則認爲它們是相同的。對於那些,使用==比較對象實例。

您可以通過覆蓋public boolean equals(Object)來更改對象的內容比較,但是如果您這樣做了,請記住您必須遵守三條規則才能正確運行Java框架的其餘部分。

  1. 反身:a.equals(a)必須是真的。
  2. 對稱:如果a.equals(b),hen b.equals(a)必須爲真。
  3. 傳遞:如果a.equals(b)和b.equals(c)則a.equals(c)必須爲真。

此外,相等操作應該是一致的,這樣如果a.equals(b)並且沒有更新a或b,那麼a.equals(b)應該保持爲真。

一旦您覆蓋等於,您可以通過覆蓋public int hashcode()返回相同的值,只要equals(...)將返回true,就可以獲得散列相關集合中的性能改進。另外,如果equals(...)返回false,則返回相同值的機會應該很低。因爲在檢查可能的等於hashcode(...)之後,所有Java集合例程檢查equals(...),所以不需要製作「完美」散列,其中hashcode(...)保證返回不同值。

相關問題