Java中含AddressDTO的StudentDTO如何实现equals与hashCode方法?
实现StudentDTO的equals和hashCode方法
首先必须明确:AddressDTO类必须先正确实现equals和hashCode方法,否则StudentDTO中对address属性的比较会是引用地址比较,而非内容比较,导致equals结果不符合预期。
第一步:实现AddressDTO的equals和hashCode
假设AddressDTO包含常见属性(如street、city),示例代码如下:
import java.util.Objects; public class AddressDTO { private String street; private String city; // 构造器、getter/setter(按需添加) @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; AddressDTO that = (AddressDTO) o; return Objects.equals(street, that.street) && Objects.equals(city, that.city); } @Override public int hashCode() { return Objects.hash(street, city); } }
如果使用Lombok,直接给AddressDTO加上@Data注解即可自动生成正确的equals和hashCode。
第二步:实现StudentDTO的equals和hashCode
方式一:手动实现
如果不依赖Lombok,手动编写代码如下:
import java.util.Objects; public class StudentDTO { public AddressDTO address; public String name; @Override public boolean equals(Object o) { // 同一对象直接返回true if (this == o) return true; // 判断是否为null或类型不匹配 if (o == null || getClass() != o.getClass()) return false; // 强转后比较属性 StudentDTO that = (StudentDTO) o; // 使用Objects.equals处理null值,避免空指针 return Objects.equals(address, that.address) && Objects.equals(name, that.name); } @Override public int hashCode() { // 组合属性哈希值,null值会被Objects.hash正确处理 return Objects.hash(address, name); } }
方式二:利用Lombok的@Data
你当前代码已经使用了@Data注解,它会自动生成equals和hashCode方法,但要满足两个条件:
- AddressDTO必须正确实现equals和hashCode(如加
@Data或手动实现) - 确保Lombok依赖已正确引入项目
此时StudentDTO代码无需修改,只要AddressDTO符合要求,s1.equals(s2)就能正确比较name和address的内容。
关键注意点
- 永远使用
Objects.equals(a, b)而非直接a.equals(b),避免空指针异常 - hashCode的实现要和equals保持一致:如果两个对象equals返回true,它们的hashCode必须相等;反之,hashCode相等的对象不一定equals返回true
- 不要遗漏任何需要比较的属性,否则equals逻辑不完整
内容的提问来源于stack exchange,提问作者user2042166
相关产品推荐
相关产品推荐

