0

也许这个问题应该分为两个,但第一个很简单,它是关于.equals()。我认为 == 检查两个引用是否指向同一个对象,同时.equals()检查它们的参数值是否相同,如下所述:http: //www.coderanch.com/t/409507/java/java/Difference-等于

但后来我尝试运行这个:

public class EqualsTest {

    public static void main(String[] args) {
        Integer i1 = new Integer(1);
        Integer i2 = new Integer(1);
        System.out.println(i1.equals(i2));

        Nested n1 = new Nested();
        Nested n2 = new Nested();
        n1.i = i1;
        n2.i = i2;
        System.out.println(n1.equals(n2));
    }
}

class Nested {
    Integer i;
}

我得到输出:

true
false

正如预期的那样阅读Javadoc http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#equals(java.lang.Object)

因此,据我了解,要.equals()与 == 有所不同,我们需要覆盖它。正确的?

我的第二个问题是,有没有什么方法可以使类<A>中的对象在 a 中唯一(调用时自动覆盖add()Set<A>而不覆盖 .equals() 中的方法<A>

4

3 回答 3

3

要使 .equals() 与 == 不同,我们需要覆盖它。正确的?

是的,这是正确的。

有什么方法可以使类中的对象在 Set 中唯一(调用 add() 时自动覆盖)而不覆盖 .equals() 中的方法?

如果您不覆盖 equals,则每个新实例从集合的角度来看都是唯一的。

于 2013-05-16T14:52:38.013 回答
1

为了确保您的对象在所有情况下都正确运行,您应该实现equalshashCode 通过Comparable实现compareTo.

请记住,HashSet使用equalshashCodeTreeSet使用compareTo

于 2013-05-16T15:21:35.470 回答
1

虽然覆盖 .equals() 是该过程的一部分,但您必须覆盖 hashCode()。

在一个集合中,尤其是HashSet,调用 .hashCode() 方法来获取哈希码,然后,只有当两个对象具有相同的 hashCode 时,它​​们才会检查 .equals()。

您应该在此处阅读有关equals/hashcode合同的文档:

于 2013-05-16T15:22:52.727 回答