Java自定义类调用equals()方法对比对象始终返回false是什么原因?
问题原因
- Java中所有类默认继承自
Object父类,Object提供的原生equals()方法的逻辑是直接对比两个对象的内存地址,只有两个引用指向堆中的同一个对象时才会返回true。 - 你代码中
myHouse1和myHouse2是两次new创建的独立对象,内存地址完全不同,如果你没有在自定义的house类中重写equals()方法,调用的就是Object的原生实现,自然始终返回false。 - 额外优化点:你写的
match方法可以直接简化为return h2.equals(h1);,不需要额外的if-else判断。
修复方案
- 首先在自定义的
house类中重写equals()方法,按照业务逻辑(比如所有属性相等就认为对象相等)编写对比规则 - 遵循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
相关产品推荐
相关产品推荐

