2017-03-09 89 views
1

兩個相等的對象必須具有相同的toString輸出嗎?兩個相等的對象必須具有相同的toString輸出嗎?

在代碼中,以下內容是否必須保持一般?

if(o1.equals(o2)) 
    return o1.toString().equals(o2.toString()) // always true? 

我問,因爲我剛剛寫了一toString方法,其中,上述說法不舉行。我無法在文檔中找到任何提示,但我想確保我的toString方法不會違反任何合同規則。

+2

不一定,如果你打印的屬性沒有被equals方法使用。如何定義'toString()'以及equals所使用的屬性? – 2017-03-09 12:21:52

回答

5

不,它們不必具有相同的toString()輸出才能相等。 Java中沒有合同說明equals()方法必須對對象本身及其方法toString()都適用。

唯一合同equals()具有與其它方法是hashCode()

注意,這是通常需要覆蓋hashCode方法每當這個方法[等於]被覆蓋,從而保持爲一般合同hashCode方法,它聲明相等的對象必須具有相同的散列碼。

它具有不論其他方法該合同是:

  • 自反性:對於任何非空引用值x,x.equals(x)的應返回true。

  • 它是對稱的:對於任何非空引用值x和y,當且僅當y.equals(x)返回true時,x.equals(y)才返回true。如果x.equals(y)返回true並且y.equals(z)返回true,那麼x.equals(z)應該是可傳遞的:對於任何非空引用值x,y和z,如果x.equals(z)返回true。前提條件是:對於任何非空引用值x和y,x.equals(y)的多個調用始終返回true或始終返回false,前提是未修改對象的等號比較中使用的信息。

  • 對於任何非空引用值x,x.equals(null)應該返回false。

來源:https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-

編輯:有些人說,有效的Java由約書亞布洛赫說,toString()方法應使用相同的字段equals()方法。這不是真的。他指出:

雖然它不像遵守equals和hashCode約定(Item 8,Item 9)一樣重要,但提供一個很好的toString實現可以讓您的類更好用。

他歸類什麼是「好的執行」是:

當實際,toString方法將返回所有包含在對象中的有趣的信息,如上面所示的電話號碼的例子。如果對象很大或者它包含不利於字符串表示的狀態,這是不切實際的。在這些情況下,toString應該返回一個摘要,如「曼哈頓白頁(1487536列表)」或「Thread [main,5,main]」。

因此不,它決不涉及equals()方法。

+0

爲什麼不在https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)處引用官方Javadoc呢?它在'equals'方法下有相同的解釋。 – toongeorges

+0

Joshua Bloch指出'toString'應該與'equals'一致,至少與'equals'中使用的數據相同,但它可以顯示更多。如果你仔細想想,如果兩個對象相等,只有'toString'產生相同的值纔有意義。 –

+0

您應該參考Java 8文檔或更高版本。幾年前,Java 7已經達到了生命的終結。 –

-1

toString沒有合約,只適用於equals和hashCode。從我的角度來看,這也沒有意義。

想象一下o1和o2是類Person {},那麼你只能得到引用的字符串。

+0

「參考字符串」?那是什麼意思?當然,你寫'toString'來顯示相關信息,即確定相等的信息,所以不,不管它意味着什麼,除非你這樣寫,否則不會「只得到引用的字符串」。 –

+0

像這樣的人@ 78308db1這是堆上的參考。 –

+0

這是一個附帶一些代碼字符串的散列碼,不是「堆上的引用」,爲什麼你會像這樣離開'toString'?當然你寫toString來顯示相關信息,即確定平等的信息。就像聲明的那樣。當你重載'hashCode','equals'和'compareTo'時,想法是重寫'toString'。重寫,而不是保持不動。當你覆蓋它時,你保持一致。如何閱讀_有效的Java_?你會在那裏得到細節。 –

0

對此沒有要求。 equalshashCode之間存在依賴關係:等於對象必須返回相同的hashCode值。 toString僅用於打印對象。

-1

hashCode匹配equals沒有「要求」,只是最好的做法,或者你的程序沒有意義。同toString。它應該與equals一致,應該使用compareTo。有關Joshua Bloch的Java的基本原理見。那些告訴你的人需要閱讀那本書,因爲他們錯了。

+0

我讀過這本書,它並沒有說任何關於toString匹配的東西。查看我的回答,以獲取Effective Java,2nd Edition的相關報價。 –

+0

「實際操作時,toString方法應返回對象中包含的所有有趣信息」,這顯然包含用於確定值相等的字段。 –

+0

我不同意,我認爲這並不意味着它「顯然包括用於確定價值平等的領域」。 此外,你所引用的內容緊接着是:「如果對象很大或者它包含不利於字符串表示的狀態是不切實際的,在這種情況下,toString應該返回一個摘要,比如'Manhattan white pages( 1487536 listing)'或'Thread [main,5,main]'「 –

相關問題