You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何交换Cat对象调用fight方法时hashCode输出未改变?

问题分析与解答

首先,咱们先理清第一个核心点:为什么两个属性完全相同的Cat对象,hashCode却不一样?

因为你没有重写Cat类的hashCode()方法,此时使用的是父类Object的默认实现。Object.hashCode()的返回值是基于对象的身份标识(通常和对象在内存中的地址关联),而不是对象的属性值。哪怕两个Cat对象的age、weight、strength完全一致,它们也是两个独立的对象实例,所以hashCode自然不同——这是完全正常的行为。

接下来是你提到的困惑:交换调用fight方法时,输出的hashCode顺序居然没变化?

按照你的代码逻辑,正常情况应该是这样的:

  • 调用cat1.fight(cat2)时,this指向cat1,anotherCat指向cat2,所以打印的是cat1.hashCode()和cat2.hashCode();
  • 调用cat2.fight(cat1)时,this指向cat2,anotherCat指向cat1,打印的应该是cat2.hashCode()和cat1.hashCode(),输出顺序应该和第一次反过来才对。

如果你看到两次输出顺序完全一样,大概率是测试时的小失误:比如你把两次调用的输出混在一起看,或者误判了输出对应的调用场景。当然,极端情况下JVM的hashCode实现出现重复的概率几乎为0,可以忽略。

额外建议:重写hashCode和equals

如果你希望属性相同的Cat对象拥有相同的hashCode(这也是Java编程的常见规范),你需要同时重写hashCode()和equals()方法(两者必须配套实现,否则会破坏集合类的行为)。示例代码如下:

@Override
public int hashCode() {
    int result = Integer.hashCode(age);
    result = 31 * result + Integer.hashCode(weight);
    result = 31 * result + Integer.hashCode(strength);
    return result;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Cat cat = (Cat) o;
    return age == cat.age && weight == cat.weight && strength == cat.strength;
}

这样修改后,只要两个Cat对象的属性完全一致,它们的hashCode就会相同,equals()也会返回true,符合Java的对象相等性约定。

内容的提问来源于stack exchange,提问作者user12496134

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:22:48