不同对象含相同字符串值时Equals方法返回false问题咨询
解决不同
KeyValueDTO对象持相同字符串值但equals()返回false的问题 嗨,这个坑我之前也踩过!你遇到的问题核心原因很明确:你没有给KeyValueDTO类重写equals()和hashCode()方法。
为什么会出现这个问题?
Java中所有类默认继承自Object类,而Object类的equals()方法默认是比较两个对象的内存地址——也就是判断它们是不是同一个实例,而非对象内部的字段值。所以哪怕两个KeyValueDTO的key和value字符串完全一致,只要它们是循环里每次new出来的不同实例,调用equals()就会返回false。
怎么解决?
你需要给KeyValueDTO类重写equals()方法,让它基于key和value的内容来判断相等性;同时一定要配套重写hashCode()方法——这是Java的约定:如果两个对象通过equals()判断相等,它们的hashCode()必须返回相同的值,否则后续把这些对象放到HashMap、HashSet这类集合里会出各种奇怪的问题。
下面是重写后的示例代码:
import java.util.Objects; public class KeyValueDTO { private String key; private String value; // 这里省略你的getter、setter、构造方法 @Override public boolean equals(Object o) { // 先判断是不是同一个对象,是的话直接返回true if (this == o) return true; // 如果传入的是null,或者类型不匹配,直接返回false if (o == null || getClass() != o.getClass()) return false; // 强转成KeyValueDTO类型 KeyValueDTO that = (KeyValueDTO) o; // 用Objects.equals比较字段,自动处理null的情况,避免空指针 return Objects.equals(key, that.key) && Objects.equals(value, that.value); } @Override public int hashCode() { // 基于key和value生成哈希值 return Objects.hash(key, value); } }
补充说明
- 如果你业务里只需要判断
key相等就算对象相等,可以在equals()和hashCode()里只保留key字段的比较,按需调整即可。 - 用
Objects.equals()而非直接key.equals(that.key),是因为它能安全处理字段为null的情况,不会抛出NullPointerException。
内容的提问来源于stack exchange,提问作者Aniket Bare
相关产品推荐
相关产品推荐

