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

Java自定义类调用equals()方法对比对象始终返回false是什么原因?

问题原因

  • Java中所有类默认继承自Object父类,Object提供的原生equals()方法的逻辑是直接对比两个对象的内存地址,只有两个引用指向堆中的同一个对象时才会返回true。
  • 你代码中myHouse1和myHouse2是两次new创建的独立对象,内存地址完全不同,如果你没有在自定义的house类中重写equals()方法,调用的就是Object的原生实现,自然始终返回false。
  • 额外优化点:你写的match方法可以直接简化为return h2.equals(h1);,不需要额外的if-else判断。

修复方案

  1. 首先在自定义的house类中重写equals()方法,按照业务逻辑(比如所有属性相等就认为对象相等)编写对比规则
  2. 遵循Java规范同步重写hashCode()方法,保证两个equals()返回true的对象哈希值一致,避免后续在HashMap、HashSet等集合中使用该类时出现逻辑错误

小提示:如果类的字符串属性可能为null,对比属性时可以用java.util.Objects.equals(属性1, 属性2)避免空指针异常。

修复后的house类示例代码:

// Java类名规范建议首字母大写
public class House {
    private String name;
    private int param1;
    private int param2;

    // 原有构造方法
    public House(String name, int param1, int param2) {
        this.name = name;
        this.param1 = param1;
        this.param2 = param2;
    }

    // 重写equals方法
    @Override
    public boolean equals(Object o) {
        // 先判断是不是同一个对象
        if (this == o) return true;
        // 判断对比对象为空或者类型不匹配的情况
        if (o == null || getClass() != o.getClass()) return false;
        House house = (House) o;
        // 逐个对比所有属性
        return param1 == house.param1 && param2 == house.param2 && name.equals(house.name);
    }

    // 重写hashCode方法
    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + param1;
        result = 31 * result + param2;
        return result;
    }
}

简化后的main类代码:

public class Main {
    public static boolean match(House h1,House h2) {
        return h2.equals(h1);
    }
    public static void main(String[] args) {
        House myHouse1 = new House("jj",5,5);
        House myHouse2 = new House("jj",5,5);
        
        System.out.println(match(myHouse1,myHouse2));
    }
}

修改后运行代码即可得到预期的true结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:54:10