忽略equals()和hashCode()在Java中
可能重复:
Overriding equals and hashCode in Java忽略equals()和hashCode()在Java中
所有,
我定义我的类和重写equals()和hashCode()方法也是如此。但我不知道这些方法应该为我自己的班级实施具体的方法。任何人都可以谈谈这些自定义类的实现吗?
你说你已经知道了,你的自定义类的一个需要重写的hashCode /等于一个测试?然后你也知道哪些属性(全局变量)决定了每个类的相等性。当你知道这些属性时,你可以手动实现hashCode/equals,也可以通过使用诸如Eclipse,NetBeans等现代IDE来生成方法。在Eclipse中有一个名为“Generate hashCode()and equals()”的选项。在“来源”菜单下
此答案是指向返回503页的IBM页面的链接。你认为你可以更新你的答案,包括相关信息,而不仅仅是一个链接? – 2014-08-11 11:19:05
@MichaelT这个链接仍然是活动的...... – 2014-08-13 04:44:08
对于平等,答案取决于你的业务需求是什么,也就是这是什么意思你的对象是平等的。
hashCode()应该总是返回一个对象的唯一值,除非该对象等于另一个对象。它应该取决于对象上属性的值。
最重要的是,hashCode()必须*不*返回true的对象返回不同的值 – 2010-10-12 21:58:26
@michael好点,编辑答案.. – hvgotcodes 2010-10-12 21:59:21
它不能总是返回一个独特的价值。最简单的方法是依赖与equals相同的属性。 – Ishtar 2010-10-12 22:07:11
基本上,如果你想存储的对象集合(地图,设置,列表)中,然后你必须实现根据文档中定义的合同equals和hashCode方法。
在散列中只有*键*必须正确定义散列码。如果我使用'String'作为键,并且使用String,则'equals()'或'hashCode()'方法可以将我的Froboz对象存储在HashMap中, )'和'hashCode()'实现已经被正确定义。 – jbindel 2010-10-12 22:09:16
是的。但http://download.oracle.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object)将失败。 – 2010-10-12 22:14:42
执行equals()时,请确保您了解相等和身份之间的区别。 两个对象实例可能“相等”,但可能不完全相同。 a.equals(b)是您的业务规则应该定义的等式测试。 ==是对象标识(同一个对象实例)
这实际上取决于您如何定义相等性。通常所有或几乎所有的属性都需要考虑,有时候只有一个/几个,有时候(比如想到线程),你所需要的equals()方法就是比较身份。 – helpermethod 2010-10-12 22:17:12