![](/img/trans.png)
[英]Do two classes of the same class have the same hashcode and are they considered equal?
[英]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()
方法無關。
沒有要求。 equals
和hashCode
之間存在依賴關系:相等的對象必須返回相同的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.