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

Joh*_*ood 1 java equals tostring

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

在代码中,以下是否必须保持一般?

if(o1.equals(o2))
  return o1.toString().equals(o2.toString()) // always true?
Run Code Online (Sandbox Code Playgroud)

我问,因为我刚写了一个toString针对上述说法没有方法成立.我在文档中找不到任何提示,但我想确保我的toString方法不违反任何合同规则.

Jon*_*ing 5

不,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()方法没有任何关系.