Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否需要重写类的equals方法<;A>;获取集合中唯一对象的步骤<;A>;?_Java_Set_Equals - Fatal编程技术网

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,该类不属于我。我必须用其他方法来做。我可以建议的一种方法是使用带有自定义比较器的
树形图。当然,如果您没有订购这些物品,这不是一个选项。在这种情况下,您可以使包装器对象实现相等。