我用Java生成了一堆对象。每个对象都有属性区域和一组整数。我想将这些对象存储在例如地图中(键应该是按成长顺序排列的整数)。如果两个对象的面积相等且它们的集合相同,则它们是相同的。
如果两个物体没有相同的区域,那么我就不需要检查它们的组是否相同。
在Java中实现此功能的最佳实践是什么?我应该如何编写散列和相等的函数?
答案 0 :(得分:1)
答案 1 :(得分:1)
首先在equals
(==
和课程类型检查之后)比较他们的区域,如果不同则返回false
。如果区域相等,则继续比较集合。
一般来说,为了实施equals
(和hashCode
),这里有a relevant thread和a good article(包括其他一些参考资料)。
答案 2 :(得分:1)
根据经验,您应该比较equals()
实施中的所有相关字段(最快的,首先比较您的area
,然后比较整数集)并使用相同的字段你的hashCode()
。如果有疑问,请使用Eclipse的Source - Generate hashCode() and equals()...
功能(然后修复equals()
代码以首先比较area
。)
答案 3 :(得分:1)
以下是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
- 因此您可以重复使用该方法。这是测试化合物类型是否相等的惯用方法。