@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("[email protected]");

        User user2 = new User();
        user2.setName("张三");
        user2.setAge(25);
        user2.setEmail("[email protected]");

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

四,注意事项

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

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

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

五,总结

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

相关推荐
双叶8364 分钟前
(C语言)学生信息表(学生管理系统)(基于通讯录改版)(正式版)(C语言项目)
c语言·开发语言·c++·算法·microsoft
AQin10129 分钟前
【Leetcode·中等】如何初始化(583.两个字符串的删除操作·Delete Operation for Two Strings)
java·算法·leetcode·动态规划
石去皿17 分钟前
力扣hot100 31-40记录
java·算法·leetcode
IT从业者张某某19 分钟前
Python数据可视化-第4章-图表样式的美化
开发语言·python·信息可视化
脑子慢且灵33 分钟前
【蓝桥杯】 枚举和模拟练习题
java·开发语言·职场和发展·蓝桥杯·模拟·枚举
m0_6640470244 分钟前
基于Spring Boot+Layui构建企业级电子招投标系统源码
java·spring cloud·招投标系统源码·电子招标采购系统源码·企业电子招标采购系统源码
我不是程序猿儿1 小时前
【C#】设备回帧太快、数据没收完整就被读取,导致帧被拆、混、丢,很常见,尤其在高频通信设备,解决方案
开发语言·c#
小郝 小郝1 小时前
(C语言)指针运算 习题练习1.2(压轴难题)
java·开发语言·算法
放肆的驴1 小时前
EasyDBF Java读写DBF工具类(支持:深交所D-COM、上交所PROP)
java·后端
DavidSoCool1 小时前
Java使用Californium 实现CoAP协议交互代码案例
java·物联网