也许这个问题应该分为两个,但第一个很简单,它是关于.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
使用equals
和hashCode
,但TreeSet
使用compareTo
。
虽然覆盖。equals()是过程的一部分,但您还必须覆盖hashCode()。
在一个集合中,特别是HashSet
,调用。hashcode()方法来获取hashcode,然后,只有当两个对象具有相同的hashcode时,才检查它们是否为。equals()。
您应该在这里阅读equals/hashcode
合同的文档:
- hashCode ()
- equals ()