@Data 自动生成 equals 和 hashCode 方法,基于非静态非 transient 字段按声明顺序比较并递归调用字段自身方法,但需注意 ID 为空、集合元素未重写、敏感字段参与及继承时父类字段缺失等问题。

使用 Lombok 的 @Data 注解可以自动为类生成 equals() 和 hashCode() 方法,无需手动编写,但需理解它默认的行为和潜在限制。
✅ @Data 自动生成 equals 和 hashCode 的规则
@Data 是一个组合注解,等价于 @ToString + @EqualsAndHashCode + @Getter + @Setter + @RequiredArgsConstructor。其中 @EqualsAndHashCode 负责生成 equals() 和 hashCode() 方法,它默认:
- 只基于所有非静态、非 transient 的字段(包括 private 字段)参与比较和哈希计算
- 按字段在类中声明的顺序依次比较
- 会递归调用字段自身的
equals()和hashCode()(例如对 List、自定义对象等) - 不包含父类字段(除非显式启用
callSuper = true)
⚠️ 常见陷阱与注意事项
直接加 @Data 很方便,但以下情况需特别留意:
- 数据库实体含主键 ID(如 Long id):若对象尚未持久化(id 为 null),两个“逻辑相同”的新对象因 id 不同会被判为不等 —— 此时应排除 id 字段,改用业务关键字段(如 username、email)参与比较
-
含集合或嵌套对象:确保其元素类型也正确实现了
equals/hashCode,否则可能比较失效(例如用ArrayList没问题,但自定义类未重写就会用默认引用比较) -
字段含敏感信息(如 password):不应参与 equals 判断,需用
@EqualsAndHashCode.Exclude排除 -
继承关系:
@Data默认不考虑父类字段;若需包含,要显式写@EqualsAndHashCode(callSuper = true),且父类也得有正确实现
? 自定义参与比较的字段(推荐做法)
更安全的方式是明确指定哪些字段用于 equals/hashCode,避免意外包含不该比的字段:
立即学习“Java免费学习笔记(深入)”;
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class User {
@EqualsAndHashCode.Include
private String username;
@EqualsAndHashCode.Include
private String email;
private String password; // 不参与比较
private Long id; // 不参与比较(新增对象 id 为空)
}
这样只有 username 和 email 被纳入逻辑相等判断,清晰可控。
? 依赖与启用方式
确保项目已引入 Lombok 并开启注解处理器:
- Maven 依赖:
org.projectlombok:lombok(scope 通常为provided) - IDE 需安装 Lombok 插件(IntelliJ / Eclipse),并启用 annotation processing
- 编译时 Lombok 会在字节码中注入方法,源码里看不到生成的
equals和hashCode,但可被正常调用
只要字段语义合理、排除干扰项,@Data 生成的 equals 和 hashCode 完全可用,省事又可靠。


















