2014-02-25 145 views
0

我不確定任何人都會知道這個問題的答案,除非你負責編寫Jave API,但是當Java API說「等於」時,它是否意味着a.equals(b)的計算結果爲true,或者有時候會這樣意思是a == btrue?我最近擴展了一堂課,並想知道是否需要重寫一個方法,具體取決於使用的方法==.equals。具體而言,我擴展了javafx.beans.binding.ObjectExpression,並對.isEqualTo(Object other)方法感到好奇。我檢查了來源(here),發現此方法使用.equals進行比較。我很好奇,如果我可以確信,當我看到像Java API中的「equals」是什麼意思?

「創建一個新的BooleanExpression,如果此ObjectExpression等於一個常量值,則爲true」。

該方法沒有使用==運算符。雖然,我想起來了,該API不可能想.equals,因爲相關(例如)

String constant = "constant"; 
ObjectExpress<String> stringExpression = new MyStringExpression("constant"); 

constant.equals(stringExpression) 

將始終計算爲false。所以也許我的問題應該是「當API說'等於'時,它是否總是指最合理的方法來應用.equal或者某個時候它是指類似的方式來應用==

編輯

我想根據我要澄清的答案:這是不是一個==.equal之間的差異問題。 Java API在使用英文單詞「equals」時將涉及哪些內容。

+2

'=='總是比較引用。通常當我們說「等於」時,我們指的是內容,而不是參考。 – Maroun

+0

好的API文檔不應該調用「==」「equal」,比較http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilder.html#weakKeys%28% 29 – zapl

回答

1

這是否意味着a.equals(b)的計算結果爲true,或者有時 是否意味着a == b是真的? 當API說「等於」,它總是與最 合理的方式應用.equal或有時它指的是 類似的方式應用==?」

這是關於覆蓋equals()方法在Java中,只有+=運營商超載,其他運營商不能超載的手段,不能覆蓋==

+0

問這個問題的人確實明白這一點。你是對的,但他沒有問過*這個*。 –

+1

+1''+'對於字符串也是重載的,但是這是用語言定義的,不能被程序員改變。 –

0

如果使用.equals將比較值的。通過使用==你比較基準,並沒有按這些」即使您的數值相同,也必須保持一致。

請參閱以下網址的完整說明:http://www.javabeat.net/what-is-difference-between-equals-and/

我抄他的榜樣的一部分:現在

s1 = new String("abc"); 
s2 = new String("abc"); 

,如果使用equals()方法來檢查它們的等價作爲

if(s1.equals(s2)) 
    System.out.println("s1.equals(s2) is TRUE"); 
else 
    System.out.println("s1.equals(s2) is FALSE"); 

equals()方法檢查內容相等性時,您將得到輸出爲TRUE。 讓檢查==運營商..

if(s1==s2) 
    System.out.printlln("s1==s2 is TRUE"); 
    else 
    System.out.println("s1==s2 is FALSE"); 

現在,您將得到FALSE作爲輸出,因爲S1和S2都指向兩個不同的對象,即使他們都共享相同的字符串內容。這是因爲每次創建一個新對象時都會有new String()

+0

同樣,問這個問題的人確實明白這一點。你是對的,但他沒有問過*這個*。 –

1

當使用術語時寫的API-doc的「平等」這應該通常是指「等於在equals() - 方法的條款」。如果它確實取決於文檔作者的徹底性,但在官方的API文檔中,我會始終認爲這是有意義的。

對於你的問題「可以把它也意味着==」:它可以在Objectequals() - 方法只檢查參考身份的辦法,那就是它會檢查使用==

2

很明顯,你理解()和equals的區別==。所以,你的問題是頗具哲理:)

一般來說,許多API使用「等於」在平等的含義()和「是一樣的」,在==的意義。例如。 JUnit有斷言方法assertEquals()assertSame()

然而,使用常識,並分析doucmentation的語言。從API您引用的句子通知不定冠詞的用法:

「創建,如果這 ObjectExpression等於一個常數值成立一個新的BooleanExpression。」

一個恆定值」顯然意味着任何恆定值,而不是相同的值"constant"值。所以很明顯,這並不意味着與constant.equals(stringExpression)相同。

所以把它這樣:當文檔中說「等於」,認爲它涉及到的變量內容,而不是它的參考。但使用常識和閱讀句子作爲一個整體:)

是否回答你的問題? :P

0

當有人創建一個java類時,它繼承了類'Object'中的boolean equals(Object o)方法,因爲所有用戶定義的類當不擴展任何其他類時都會隱式擴展class Object

當這個類是使用new操作者此對象的相等實例化是通過使用此下劃線公式來實現的。

return (this == obj); 

因此,它將返回true,當且僅當兩個對象引用堆i上的相同對象時。E(A == B)=真

class Abc{} 
    Abc a = new Abc(); 
    Abc b = a; 
    a==b //(true) 
    a.equals(b) //(true) 

並假設它們是同一類的實例,但是兩個不同的對象比

class Abc{} 
    Abc a = new Abc(); 
    Abc b = new Abc(); 
    a==b; //(false) 
    a.equals(b); //(false) 

但是,當一個類創建覆蓋此equals方法那麼這是平等使用提供的新公式進行評估,同時覆蓋它。例如通過java.util.Date

public boolean equals(Object obj) { 
      return obj instanceof Date && getTime() == ((Date) obj).getTime(); 
    } 

.equals對象覆蓋,當且僅兩個日期對象具有由的getTime()方法返回的值等於這將返回true。

希望這會有所幫助。如有疑問,請隨時提出進一步的問題。

+0

'equals'的一個令人討厭的問題是可變類型的類對象可以被用作值或實體,並且對這樣的類對象的引用可以封裝它們的值或它們的標識。要知道兩個引用是否應該被認爲是「平等的」,人們必須知道他們封裝了什麼,但是沒有標準的方式可以告訴類對象的實例可以告訴他們應該使用什麼樣的平等,也不知道集合是什麼類型的平等的要求在他們的內容。 – supercat