Java HashSet add()方法不会调用重写的equals()方法

Krz*_*Hal 3 java equals

我有这个代码:

@Override
public boolean equals(Object obj) {

    System.out.println("equals called");

    if(this == obj) {
        System.out.println("THIS object is the same as OBJ");
        return true;
    }

    System.out.println("obj.getClass() is " + obj.getClass());
    System.out.println("this.getClass() is " + this.getClass());
    if ((obj == null) || (obj.getClass() != this.getClass())) {
        return false;
    }

    double objOrbitalPeriod = ((HeavenlyBody) obj).getOrbitalPeriod();
    return this.orbitalPeriod == objOrbitalPeriod;
}

@Override
public int hashCode() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在主要代码是:

private static Set<Planet> solarSystem = new HashSet<>();
public static void main(String[] args) {
    Planet planet = new Planet("Earth", 365.0);`
    solarSystem.add(planet);
    solarSystem.add(planet);
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么它不打印任何东西?

我希望它应该打印: "equals called"

和(因为它是重复的):"THIS object is the same as OBJ"

但似乎有些事情我无法理解.

Rea*_*tic 5

好吧,HashSet实现使用HashMap.在in的实现putHashMap,它使用适当的哈希定位节点,然后检查:

if (p.hash == hash &&

    ((k = p.key) == key || (key != null && key.equals(k))))

    e = p;
Run Code Online (Sandbox Code Playgroud)

这意味着它首先检查对象标识,并且只有当对象不相同时,它才会调用该equals方法.由于您的对象相同,因此equals不会调用该方法.

来源 HashMap