两个相等的对象是否必须具有相同的toString输出?
在代码中,一般情况下是否必须保留以下内容?
if(o1.equals(o2))
return o1.toString().equals(o2.toString()) // always true?
我在问,因为我刚刚写了一个toString
方法,上面的语句不持有。我在文档中找不到任何提示,但我想确保我的toString
方法不违反任何合同规则。
答案 0 :(得分:5)
不,为了平等,他们不必具有相同的-keepattributes LocalVariableTable,LocalVariableTypeTable
输出。 Java中没有合同声明toString()
方法对于对象本身及其equals()
方法都必须为true。
唯一合同toString()
与其他方法有equals()
:
请注意,通常需要在重写此方法[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)应该回归真实。
它是一致的:对于任何非空引用值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说hashCode()
方法应该使用与toString()
方法相同的字段。这不是真的。他说:
虽然它不像遵守equals和hashCode合同那样重要(第8项,第9项),但提供良好的toString实现会使你的课程更加愉快。
他将其归类为“良好的实施”是:
实际上,toString方法应返回对象中包含的所有有趣信息,如刚才显示的电话号码示例所示。如果对象很大或者它包含不利于字符串表示的状态,那是不切实际的。在这种情况下,toString应该返回一个摘要,例如“Manhattan white pages(1487536 listings)”或“Thread [main,5,main]”。
所以不,它与equals()
方法没有任何关系。
答案 1 :(得分:0)
没有要求。 equals
和hashCode
之间存在依赖关系:相等的对象必须返回相同的hashCode值。 toString
仅用于打印对象。
答案 2 :(得分:-1)
toString没有合约,仅适用于equals和hashCode。从我的观点来看,它也没有意义。
想象一下o1和o2属于Person {}类,那么你只得到引用的字符串。
答案 3 :(得分:-1)
没有"要求"那hashCode
匹配equals
,只是最佳做法,或者您的计划没有意义。与toString
相同。它应与equals
一致,如果使用compareTo
则应如此。请参阅Joshua Bloch撰写的 Effective Java 的基本原理。告诉你的人否则需要阅读那本书,因为他们错了。