[英]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.