为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只名叫tom的猫 2021-06-10 18:19:34
我有这个代码:@Overridepublic 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;}@Overridepublic 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"但似乎发生了一些我无法理解的事情。
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

嗯,HashSet是使用HashMap. 在 in 的实现put中HashMap,它使用适当的散列定位节点,然后检查:


if (p.hash == hash &&


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


    e = p;

这意味着它首先检查对象身份,只有当对象不相同时,它才会调用该equals方法。由于您的对象是相同的,因此equals不会调用该方法。


查看完整回答
反对 回复 2021-06-23
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

在HashMap (a的内部实现HashSet)的源代码中,有一个if条件,表示如果两个key是同一个引用,就不需要调用equals。


...

if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))

    break;

...


查看完整回答
反对 回复 2021-06-23
  • 2 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信