兩個相等的對象必須具有相同的toString輸出嗎?兩個相等的對象必須具有相同的toString輸出嗎?
在代碼中,以下內容是否必須保持一般?
if(o1.equals(o2))
return o1.toString().equals(o2.toString()) // always true?
我問,因爲我剛剛寫了一toString
方法,其中,上述說法不不舉行。我無法在文檔中找到任何提示,但我想確保我的toString
方法不會違反任何合同規則。
兩個相等的對象必須具有相同的toString輸出嗎?兩個相等的對象必須具有相同的toString輸出嗎?
在代碼中,以下內容是否必須保持一般?
if(o1.equals(o2))
return o1.toString().equals(o2.toString()) // always true?
我問,因爲我剛剛寫了一toString
方法,其中,上述說法不不舉行。我無法在文檔中找到任何提示,但我想確保我的toString
方法不會違反任何合同規則。
不,它們不必具有相同的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()
方法。
爲什麼不在https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)處引用官方Javadoc呢?它在'equals'方法下有相同的解釋。 – toongeorges
Joshua Bloch指出'toString'應該與'equals'一致,至少與'equals'中使用的數據相同,但它可以顯示更多。如果你仔細想想,如果兩個對象相等,只有'toString'產生相同的值纔有意義。 –
您應該參考Java 8文檔或更高版本。幾年前,Java 7已經達到了生命的終結。 –
toString沒有合約,只適用於equals和hashCode。從我的角度來看,這也沒有意義。
想象一下o1和o2是類Person {},那麼你只能得到引用的字符串。
「參考字符串」?那是什麼意思?當然,你寫'toString'來顯示相關信息,即確定相等的信息,所以不,不管它意味着什麼,除非你這樣寫,否則不會「只得到引用的字符串」。 –
像這樣的人@ 78308db1這是堆上的參考。 –
這是一個附帶一些代碼字符串的散列碼,不是「堆上的引用」,爲什麼你會像這樣離開'toString'?當然你寫toString來顯示相關信息,即確定平等的信息。就像聲明的那樣。當你重載'hashCode','equals'和'compareTo'時,想法是重寫'toString'。重寫,而不是保持不動。當你覆蓋它時,你保持一致。如何閱讀_有效的Java_?你會在那裏得到細節。 –
對此沒有要求。 equals
和hashCode
之間存在依賴關係:等於對象必須返回相同的hashCode值。 toString
僅用於打印對象。
hashCode
匹配equals
沒有「要求」,只是最好的做法,或者你的程序沒有意義。同toString
。它應該與equals
一致,應該使用compareTo
。有關Joshua Bloch的Java的基本原理見。那些告訴你的人需要閱讀那本書,因爲他們錯了。
我讀過這本書,它並沒有說任何關於toString匹配的東西。查看我的回答,以獲取Effective Java,2nd Edition的相關報價。 –
「實際操作時,toString方法應返回對象中包含的所有有趣信息」,這顯然包含用於確定值相等的字段。 –
我不同意,我認爲這並不意味着它「顯然包括用於確定價值平等的領域」。 此外,你所引用的內容緊接着是:「如果對象很大或者它包含不利於字符串表示的狀態是不切實際的,在這種情況下,toString應該返回一個摘要,比如'Manhattan white pages( 1487536 listing)'或'Thread [main,5,main]'「 –
不一定,如果你打印的屬性沒有被equals方法使用。如何定義'toString()'以及equals所使用的屬性? – 2017-03-09 12:21:52