Java 是否需要重写类的equals方法<;A>;获取集合中唯一对象的步骤<;A>;?
也许这个问题应该分为两个,但第一个问题很简单,它是关于Java 是否需要重写类的equals方法<;A>;获取集合中唯一对象的步骤<;A>;?,java,set,equals,Java,Set,Equals,也许这个问题应该分为两个,但第一个问题很简单,它是关于.equals()。我认为==检查两个引用是否指向同一个对象,而.equals()检查它们的参数值是否相同,如下所述: 但后来我试着运行这个: public class EqualsTest { public static void main(String[] args) { Integer i1 = new Integer(1); Integer i2 = new Integer(1);
.equals()
。我认为==检查两个引用是否指向同一个对象,而.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时所预期的那样
因此,根据我的理解,要使.equals()
不同于==,我们需要重写它对吗?
我的第二个问题是,是否有任何方法可以使类
中的对象在集中唯一(在调用add()
时自动重写),而不重写
中的方法.equals()
要使.equals()不同于==,我们需要重写它。对吧?
是的,没错
是否有任何方法可以使类中的对象在集合中是唯一的(在调用add()时自动重写),而不重写中的.equals()方法
如果不重写equals,则从集合的角度来看,每个新实例都将显示为唯一的
要使.equals()不同于==,我们需要重写它。对吧?
是的,没错
是否有任何方法可以使类中的对象在集合中是唯一的(在调用add()时自动重写),而不重写中的.equals()方法
如果不重写equals,则从集合的角度来看,每个新实例都将显示为唯一的。为确保对象在所有情况下都能正确运行,应实现equals
,hashCode
,并通过实现compareTo
使其实现Comparable
请记住,HashSet
使用equals
和hashCode
,但是TreeSet
使用compareTo
来确保对象在所有情况下都能正确运行,您应该实现equals
,hashCode
和通过实现compareTo
使其实现Comparable
请记住,HashSet
使用equals
和hashCode
,但是TreeSet
在重写时使用compareTo
在一个集合中,特别是在HashSet
中,调用.hashCode()方法来获取hashCode,然后,只有当两个对象具有相同的hashCode时,才会检查.equals()
您应该在此处阅读equals/hashcode
合同上的文档:
虽然覆盖.equals()是过程的一部分,但您也必须覆盖hashCode()
在一个集合中,特别是在HashSet
中,调用.hashCode()方法来获取hashCode,然后,只有当两个对象具有相同的hashCode时,才会检查.equals()
您应该在此处阅读equals/hashcode
合同上的文档:
除了equals
之外,请小心重写hashCode
。谢谢,但是我不能重写equals,这个类不属于我。我必须用其他方法来做。我可以建议的一种方法是使用带有自定义比较器的树形图。当然,如果您没有订购这些物品,这不是一个选项。在这种情况下,您可以将实现equals的包装器对象设为。请注意,除了equals
,还要重写hashCode
。谢谢,但我不能重写equals,该类不属于我。我必须用其他方法来做。我可以建议的一种方法是使用带有自定义比较器的树形图。当然,如果您没有订购这些物品,这不是一个选项。在这种情况下,您可以使包装器对象实现相等。