lombok 的 @equalsandhashcode 注解可自动生成 equals 和 hashcode 方法,默认基于所有非静态、非瞬态字段,支持 callsuper、exclude 和 of 参数;@data 是更常用的组合注解,等价于 @equalsandhashcode 加其他常用注解。

在 Java 中,使用 Lombok 可以非常方便地自动生成 equals 和 hashCode 方法,避免手写冗长、易错的代码。只需添加一个注解即可,但要注意其行为逻辑和常见注意事项。
用 @EqualsAndHashCode 自动生成
Lombok 提供 @EqualsAndHashCode 注解,会为类自动生成 equals(Object) 和 hashCode() 两个方法。默认情况下,它基于**所有非静态、非瞬态(non-transient)字段**生成逻辑。
- 如果类有父类,且父类也定义了
equals/hashCode,Lombok 默认**不调用父类方法**(即不包含父类字段),除非显式设置callSuper = true - 可排除某些字段:用
exclude = {"fieldName"};也可只包含指定字段:of = {"name", "age"} - 示例:
@EqualsAndHashCode
public class User {
private String name;
private int age;
private transient String token; // 不参与 equals/hashCode
}
配合 @Data 更常用
日常开发中,更推荐直接使用 @Data —— 它是 Lombok 的“全功能”组合注解,等价于:@ToString + @EqualsAndHashCode + @Getter + @Setter + @RequiredArgsConstructor
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 对大多数 POJO/DTO 类,加一行
@Data就自动拥有了equals、hashCode、toString和 getter/setter - 同样支持
callSuper、exclude等参数,用法一致:
@Data(callSuper = true, exclude = "id")
public class AdminUser extends User {
private Long id;
private String role;
}
注意点与最佳实践
自动生成虽快,但需理解其隐含契约,否则可能引发集合行为异常(如 HashMap 查不到对象、Set 重复插入等):
- 不可变性优先:若对象加入 HashSet 或作为 HashMap key,建议字段尽量 final,或确保参与比较的字段不被修改,否则 hash 值变化会导致查找失败
-
继承场景谨慎:子类加
@EqualsAndHashCode(callSuper = true)时,父类也应有合理实现(或同为 Lombok 生成),否则可能破坏对称性或传递性 -
避免循环引用:若字段是其他对象,且那些对象又引用回当前类,Lombok 默认生成的
equals可能栈溢出(需手动处理或用@EqualsAndHashCode.Exclude断开)
验证是否生效
编译后可通过 IDE(如 IntelliJ)查看生成的字节码或反编译代码确认;也可以写个简单测试:
User u1 = new User("Alice", 25);
User u2 = new User("Alice", 25);
System.out.println(u1.equals(u2)); // true
System.out.println(u1.hashCode() == u2.hashCode()); // true
只要字段值相同,结果就应一致 —— 这正是 Lombok 生成逻辑所保障的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










