簡體   English   中英

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

[英]Do two equal objects have to have the same toString output?

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

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

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

我問,因為我剛剛編寫了一個toString方法,上面的語句不能保存。 我在文檔中找不到任何提示,但我想確保我的toString方法不會違反任何合同規則。

不,它們不必具有相同的toString()輸出以便相等。 Java中沒有任何契約聲明equals()方法對於對象本身及其toString()方法都必須為true。

與其他方法唯一的合約equals()hashCode()

注意,每當重寫此方法[equals]時,通常需要覆蓋hashCode方法,以便維護hashCode方法的常規協定,該方法聲明相等的對象必須具有相等的哈希碼。

與其他方法無關的合同是:

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

  • 它是對稱的:對於任何非空引用值x和y,當且僅當y.equals(x)返回true時,x.equals(y)才應返回true。

  • 它是傳遞性的:對於任何非空引用值x,y和z,如果x.equals(y)返回true而y.equals(z)返回true,則x.equals(z)應返回true。

  • 它是一致的:對於任何非空引用值x和y,x.equals(y)的多次調用始終返回true或始終返回false,前提是不修改在對象的equals比較中使用的信息。

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

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

編輯:有人說Joshua Bloch的Effective Java說toString()方法應該使用與equals()方法相同的字段。 這不是真的。 他說:

雖然它不像遵守equals和hashCode合同那樣重要(Item 8,Item 9),但是提供一個好的toString實現會讓你的類更加愉快。

他將其歸類為“良好實施”的是:

在可行的情況下,toString方法應返回對象中包含的所有有趣信息,如剛剛顯示的電話號碼示例所示。 如果對象很大或者它包含不利於字符串表示的狀態,那是不切實際的。 在這些情況下,toString應該返回一個摘要,例如“Manhattan white pages(1487536 listings)”或“Thread [main,5,main]”。

所以不,它與equals()方法無關。

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

toString沒有合約,僅適用於equals和hashCode。 從我的觀點來看,它也沒有意義。

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

有沒有“規定”指出hashCode匹配equals ,只有一個最佳實踐,它這樣做,或者你的程序將沒有意義。 toString相同。 它應符合equals ,因為應compareTo如果使用。 請參閱Joshua Bloch撰寫的Effective Java的基本原理。 告訴你的人否則需要閱讀那本書,因為他們錯了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM