Java HashSet add() 方法未调用重写的 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;

}

在主要代码是:


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);

}

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


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


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


但似乎发生了一些我无法理解的事情。


一只名叫tom的猫
浏览 202回答 2
2回答

有只小跳蛙

嗯,HashSet是使用HashMap. 在 in 的实现put中HashMap,它使用适当的散列定位节点,然后检查:if (p.hash == hash &&&nbsp; &nbsp; ((k = p.key) == key || (key != null && key.equals(k))))&nbsp; &nbsp; e = p;这意味着它首先检查对象身份,只有当对象不相同时,它才会调用该equals方法。由于您的对象是相同的,因此equals不会调用该方法。

江户川乱折腾

在HashMap (a的内部实现HashSet)的源代码中,有一个if条件,表示如果两个key是同一个引用,就不需要调用equals。...if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))&nbsp; &nbsp; break;...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java