繁体   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