Java 类不使用重写的equals

Java 类不使用重写的equals,java,overriding,equals,Java,Overriding,Equals,为什么它没有到达这里的打印行?换句话说,为什么它不使用我的重写的equals? 提前谢谢 import java.util.*; class NumberClass extends Object{ private int number; public NumberClass(int n){ number=n; } @Override public boolean equals(Object other){ System.

为什么它没有到达这里的打印行?换句话说,为什么它不使用我的重写的equals? 提前谢谢

import java.util.*;
class NumberClass extends Object{
    private int number;

    public NumberClass(int n){
        number=n;

    }
    @Override
    public boolean equals(Object other){
        System.out.println("here");
        return false;
    }
    @Override
    public String toString(){

        return number+"";
    }   
}
public class HelloWorld {
    public static void main(String[] args) {

        Set <NumberClass> set= new HashSet<NumberClass>();
        set.add(new NumberClass(0));
        set.add(new NumberClass(0));
        System.out.println(set);
    }

}
这是因为HashSet使用哈希代码来测试对象是否已经在集合中,并且只有在发生冲突时才使用equals。对象的默认哈希代码是内部id,因此两个对象相等并不意味着它们具有相同的哈希代码。在本例中,显然没有冲突,因此HashSet不需要调用equals

这就是为什么在重写equals时总是要重写hashCode。有关此主题的更多信息,请参阅。您应该编写一个hashCode方法,为相等的对象返回相等的哈希值。例如:

public int hashCode() {
    return number;
}
hashCode的一般要求是满足equals的对象应该返回相同的hash代码。请注意,没有要求equals测试失败的对象具有不同的哈希代码。如果您像Jayamohan建议的那样返回一个常量,则满足hashCode契约;但是,这将完全消除使用HashSet的好处,您也可以使用简单的ArrayList。

这是因为HashSet使用哈希代码来测试对象是否已经在集合中,并且只有在发生冲突时才使用equals。对象的默认哈希代码是内部id,因此两个对象相等并不意味着它们具有相同的哈希代码。在本例中,显然没有冲突,因此HashSet不需要调用equals

这就是为什么在重写equals时总是要重写hashCode。有关此主题的更多信息,请参阅。您应该编写一个hashCode方法,为相等的对象返回相等的哈希值。例如:

public int hashCode() {
    return number;
}

hashCode的一般要求是满足equals的对象应该返回相同的hash代码。请注意,没有要求equals测试失败的对象具有不同的哈希代码。如果您像Jayamohan建议的那样返回一个常量,则满足hashCode契约;但是,这将完全消除使用哈希集的好处,您还可以使用简单的ArrayList。

在比较对象时

如果hashCode不同,则不会调用equals方法 如果obj1==obj2,则不会调用hashCode方法 因此,在您的情况下,因为您没有重写hashCode方法,所以hash代码是不同的,因此不会调用equals。尝试如下重写hashCode方法,将调用equals方法

@Override
public int hashCode() {
    return 1;
}
Java中的API状态如下

注意,通常需要重写hashCode方法 每当重写此方法时,以保持 hashCode方法的契约,它声明必须有相等的对象 具有相等的散列码


因此,在重写equals方法时,请记住重写hashCode。

在比较对象时

如果hashCode不同,则不会调用equals方法 如果obj1==obj2,则不会调用hashCode方法 因此,在您的情况下,因为您没有重写hashCode方法,所以hash代码是不同的,因此不会调用equals。尝试如下重写hashCode方法,将调用equals方法

@Override
public int hashCode() {
    return 1;
}
Java中的API状态如下

注意,通常需要重写hashCode方法 每当重写此方法时,以保持 hashCode方法的契约,它声明必须有相等的对象 具有相等的散列码


因此,当您重写equals方法时,请记住重写hashCode。

这样它就不会使用equals方法,而是使用某种哈希代码?@Sammy-正是这样。只有当两个对象散列到同一个bucket时,它才使用equals。这就是为什么哈希表和哈希集如此高效的一部分,它们不需要对大多数且通常是集合中的任何元素进行相等性测试。因此它不使用equals方法,而是使用某种哈希代码?@Sammy-没错。只有当两个对象散列到同一个bucket时,它才使用equals。这是使哈希表和哈希集如此高效的一部分,它们不必对大多数且通常是该集的任何元素进行相等性测试。