我在Java中产生了一堆对象。每个对象都有属性区和一组整数。我想要将这些对象存储在地图中(键值应该是越来越多的整数)。如果两个对象的面积相等并且它们的集合相同,则两个对象相同。在Java中找到相同的对象
如果两个对象没有相同的区域,那么我不需要检查它们的集合是否相同。
在Java中实现这一点的最佳实践是什么?我应该如何编写散列和相等的函数?
我在Java中产生了一堆对象。每个对象都有属性区和一组整数。我想要将这些对象存储在地图中(键值应该是越来越多的整数)。如果两个对象的面积相等并且它们的集合相同,则两个对象相同。在Java中找到相同的对象
如果两个对象没有相同的区域,那么我不需要检查它们的集合是否相同。
在Java中实现这一点的最佳实践是什么?我应该如何编写散列和相等的函数?
下面是由IDE生成的样本对hashCode\equals
:
class Sample {
final int area;
final Set<Integer> someData;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Sample sample = (Sample) o;
if (area != sample.area) return false;
if (!someData.equals(sample.someData)) return false;
return true;
}
@Override
public int hashCode() {
int result = area;
result = 31 * result + someData.hashCode();
return result;
}
}
此代码假定someData
不能为空 - 以简化事情。您可以看到首先检查类型的相等性,然后检查area
相等性,然后检查相等性Set<Integer>
。请注意,在此使用内置equals
的Set
- 因此您已重新使用该方法。这是测试复合类型是否平等的惯用方法。
只需要在equals
(在==
之后进行类型检查当然)首先比较它们的区域,如果它们不同,则返回false
。如果面积相等,继续比较。
对于实施equals
(和hashCode
)一般来说,这里是a relevant thread和a good article(包括几个进一步的参考文献)。
一条经验法则是,你应该比较您的equals()
执行所有相关领域(最快第一,所以在前面比较你area
s,则整台),并在您的hashCode()
使用相同的字段。如果有疑问,使用Eclipse的Source - Generate hashCode() and equals()...
特征(。,然后修复equals()
代码到第一比较area
多个)
只有在您要对对象进行排序时才需要。如果你只需要有这样的对象的字典,你只需要适当的'hashCode()'和'equals()' – 2012-04-03 12:56:44