我是否需要重写类的 equals 方法<A>才能获取 Set 中的唯一对象<A>?



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

但是我试着运行这个:

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>类中的对象在Set<A>中是唯一的(在调用add()时自动覆盖),而不覆盖<A>中的方法。equals() ?

要使.equals()不同于==,我们需要重写它。对吧?

对,就是这样。

是否有办法使一个类中的对象在Set中是唯一的(在调用add()时自动重写)而不重写方法?

如果你不重写equals,那么从set的角度来看,每个新实例都是唯一的。

为了确保你的对象在所有情况下都能正确地工作,你应该实现equals, hashCode 通过实现compareTo来实现Comparable

请记住HashSet使用equalshashCode,但TreeSet使用compareTo

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

在一个集合中,特别是HashSet,调用。hashcode()方法来获取hashcode,然后,只有当两个对象具有相同的hashcode时,才检查它们是否为。equals()。

您应该在这里阅读equals/hashcode合同的文档:

  • hashCode ()
  • equals ()

最新更新