两个相等的对象必须具有相同的toString输出吗?

时间:2017-03-09 12:18:42

标签: java equals tostring

两个相等的对象是否必须具有相同的toString输出?

在代码中,一般情况下是否必须保留以下内容?

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

我在问,因为我刚刚写了一个toString方法,上面的语句持有。我在文档中找不到任何提示,但我想确保我的toString方法不违反任何合同规则。

4 个答案:

答案 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)

没有要求。 equalshashCode之间存在依赖关系:相等的对象必须返回相同的hashCode值。 toString仅用于打印对象。

答案 2 :(得分:-1)

toString没有合约,仅适用于equals和hashCode。从我的观点来看,它也没有意义。

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

答案 3 :(得分:-1)

没有"要求"那hashCode匹配equals,只是最佳做法,或者您的计划没有意义。与toString相同。它应与equals一致,如果使用compareTo则应如此。请参阅Joshua Bloch撰写的 Effective Java 的基本原理。告诉你的人否则需要阅读那本书,因为他们错了。