@EqualsAndHashCode注解使用

一,@EqualsAndHashCode注解来自于Lombok

@EqualsAndHashCode 是 Lombok 库提供的一个注解,用于自动生成 equals 和 hashCode 方法。这两个方法在 Java 中非常重要,特别是在集合框架中使用时,它们确保了对象的正确比较和哈希值的一致性。

二,为什么使用 @EqualsAndHashCode注解

1,减少样板代码:手动编写 equals 和 hashCode 方法非常繁琐且容易出错。

2,提高代码可读性:使用 Lombok 自动生成这些方法可以让类的定义更加简洁。

3,保证一致性:Lombok 自动生成的方法遵循 Java 官方推荐的最佳实践。

三,如何使用 @EqualsAndHashCode

1,引入依赖: 在项目的 build 文件中添加 Lombok 依赖。例如,在 Maven 的 pom.xml 文件中添加:

XML 复制代码
<dependencies>
    <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <version>1.18.24</version> <!-- 选择最新版本 -->
       <scope>provided</scope>
    </dependency>
</dependencies>

2,应用注解 : 在类定义上加上 @EqualsAndHashCode 注解。可以指定不同的选项来自定义生成的方法。

3,常见选项
of:指定哪些字段用于生成 equals 和 hashCode 方法。
callSuper:是否调用父类的 equals 和 hashCode 方法。
exclude:排除某些字段不参与生成。
doNotUseGetters:是否使用 getter 方法获取字段值,默认为 false。

4,示例

java 复制代码
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@EqualsAndHashCode(of = {"name", "age"}) // 指定使用 name 和 age 字段
//@EqualsAndHashCode(exclude = {"email"}) // 排除掉email字段,和上面一行选一个就行
public class User {

    private String name;
    private int age;
    private String email; // 不参与 equals 和 hashCode 计算

    // 其他方法和逻辑
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        User user1 = new User();
        user1.setName("张三");
        user1.setAge(25);
        user1.setEmail("zhangsan@example.com");

        User user2 = new User();
        user2.setName("张三");
        user2.setAge(25);
        user2.setEmail("zhangsan1@example.com");

        System.out.println(user1.equals(user2)); // 输出 true
        System.out.println(user1.hashCode() == user2.hashCode()); // 输出 true
    }
}

四,注意事项

1,字段顺序:@EqualsAndHashCode 默认按照字段声明的顺序进行处理,因此字段顺序可能会影响结果。

2,性能问题:如果类中有大量字段,生成的 equals 和 hashCode 方法可能会比较复杂,影响性能。

3,继承关系:如果类有继承关系,需要考虑是否调用父类的 equals 和 hashCode 方法。

五,总结

通过使用 @EqualsAndHashCode,可以显著减少代码量并提高代码的可维护性和一致性。

相关推荐
XiaoFan01216 小时前
免密批量抓取日志并集中输出
java·linux·服务器
顾北1217 小时前
MCP服务端开发:图片搜索助力旅游计划
java·spring boot·dubbo
我命由我1234517 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
赛姐在努力.17 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
yxc_inspire17 小时前
Java学习第二天
java·面向对象
毕设源码-赖学姐17 小时前
【开题答辩全过程】以 基于net超市销售管理系统为例,包含答辩的问题和答案
java
island131417 小时前
CANN ops-nn 算子库深度解析:核心算子(如激活函数、归一化)的数值精度控制与内存高效实现
开发语言·人工智能·神经网络
昀贝17 小时前
IDEA启动SpringBoot项目时报错:命令行过长
java·spring boot·intellij-idea
xcLeigh17 小时前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh17 小时前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics