在Java中查找相同的对象

时间:2012-04-03 12:52:07

标签: java object hash equality

我用Java生成了一堆对象。每个对象都有属性区域和一组整数。我想将这些对象存储在例如地图中(键应该是按成长顺序排列的整数)。如果两个对象的面积相等且它们的集合相同,则它们是相同的。

如果两个物体没有相同的区域,那么我就不需要检查它们的组是否相同。

在Java中实现此功能的最佳实践是什么?我应该如何编写散列和相等的函数?

4 个答案:

答案 0 :(得分:1)

您只需要您的对象实现Comparable interface并在compareTo方法中对您的逻辑进行编码。这是一个很好的link来帮助你实现这一目标。

答案 1 :(得分:1)

首先在equals==和课程类型检查之后)比较他们的区域,如果不同则返回false。如果区域相等,则继续比较集合。

一般来说,为了实施equals(和hashCode),这里有a relevant threada 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 - 因此您可以重复使用该方法。这是测试化合物类型是否相等的惯用方法。