当前位置: 首页 > news >正文

Lombok注解@EqualsAndHashCode

在Java开发中,我们经常需要重写equals()hashCode()方法,以确保对象在集合类(如HashSetHashMap等)中能正确地进行比较和存储。Lombok提供了@EqualsAndHashCode注解,可以帮助我们自动生成这些方法,大大简化了代码编写。本文将结合具体的Java代码示例,详细介绍@EqualsAndHashCode注解的使用。

示例代码结构

我们有三个Java文件,分别是EqualsAndHashCode使用.javaChild.javaParent.java。下面我们来详细分析这些文件。

Parent.java

package com.gqy.question.知识点.EqualsAndHashCode使用;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
class Parent{
    private Integer id;
    private String name;
}

这个类使用了Lombok的@Data@AllArgsConstructor@NoArgsConstructor注解,分别用于自动生成getter、setter、toString等方法,全参数构造函数和无参数构造函数。

Child.java

package com.gqy.question.知识点.EqualsAndHashCode使用;

import lombok.*;

@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class Child extends Parent{
    private Integer age;
    private String desc;
}

Child类继承自Parent类,除了使用@Data@AllArgsConstructor@NoArgsConstructor注解外,还使用了@EqualsAndHashCode(callSuper = true)@ToString(callSuper = true)注解。@EqualsAndHashCode(callSuper = true)表示在生成equals()hashCode()方法时,会考虑父类的属性。

EqualsAndHashCode使用.java

package com.gqy.question.知识点.EqualsAndHashCode使用;

import java.util.HashMap;
import java.util.HashSet;

/**
 * @author 顾无言
 * @version 1.0
 * @description: TODO
 * @date 2025/2/14 9:26
 */

public class EqualsAndHashCode使用 {


    public static void main(String[] args) {
        Child child1 = new Child();
        child1.setId(1);
        child1.setName("张三");
        child1.setAge(18);
        child1.setDesc("美女");
        Child child2 = new Child();
        child2.setId(2);
        child2.setName("李四");
        child2.setAge(18);
        child2.setDesc("美女");

        /**
         *不使用@EqualsAndHashCode注解,打印结果为true
         * 得出结论:不使用@EqualsAndHashCode注解,默认情况下,判断的是当前类内部所有属性的值是否相等,如果相等,则认为这两个对象是相等的。
         *         不会比较继承的父类属性字段
         **/

        /**
         * 使用@EqualsAndHashCode(callSuper = false)注解,打印结果为true
         * 得出结论:使用@EqualsAndHashCode(callSuper = false),判断的是当前类内部所有属性的值是否相等,如果相等,则认为这两个对象是相等的。
         *         不会比较继承的父类属性字段
         **/

        /**
         * 使用@EqualsAndHashCode(callSuper = true)注解,打印结果为false
         * 得出结论:使用@EqualsAndHashCode(callSuper = true),判断的是当前类内部所有属性的值 以及 父类的所有字段属性是否相等,如果相等,则认为这两个对象是相等的。
         **/


        /**
         * 综上:
         *  不使用@EqualsAndHashCode = @EqualsAndHashCode(callSuper = false)   只比较当前类的属性字段
         *  @EqualsAndHashCode(callSuper = true)    比较当前类的属性字段 以及 父类的所有字段属性
         **/

        System.out.println(child1.equals(child2));


        int i1 = child1.hashCode();
        int i2 = child2.hashCode();
        System.out.println(i2);
        System.out.println(i1);

        HashSet<Child> set = new HashSet<>();
        set.add(child1);
        set.add(child2);
        for (Child child : set) {
            System.out.println(child.toString());
        }

    }



}

在这个类的main方法中,我们创建了两个Child对象child1child2,并对它们的属性进行了赋值。然后通过不同的@EqualsAndHashCode注解使用情况进行比较,得出了以下结论:

不同使用情况及结论

不使用@EqualsAndHashCode注解

默认情况下,equals()方法判断的是当前类内部所有属性的值是否相等,如果相等,则认为这两个对象是相等的,不会比较继承的父类属性字段

不会重写equals()hashCode()方法

使用@EqualsAndHashCode(callSuper = false)注解

这种情况下,equals()方法判断的也是当前类内部所有属性的值是否相等,如果相等,则认为这两个对象是相等的,同样不会比较继承的父类属性字段

重写equals()hashCode()方法

使用@EqualsAndHashCode(callSuper = true)注解

此时,equals()方法判断的是当前类内部所有属性的值以及父类的所有字段属性是否相等,只有当这些属性都相等时,才认为这两个对象是相等的。

重写equals()hashCode()方法

总结

  • 不使用@EqualsAndHashCode注解等同于@EqualsAndHashCode(callSuper = false),只比较当前类的属性字段。(在不考虑是否重写equals()hashCode()方法)
  • 使用@EqualsAndHashCode(callSuper = true)会比较当前类的属性字段以及父类的所有字段属性。

通过合理使用@EqualsAndHashCode注解,我们可以根据实际需求来确定对象比较时是否要考虑父类的属性,从而避免手动编写繁琐的equals()hashCode()方法,提高开发效率。

相关文章:

  • apache artemis安装
  • Git 使用指南:避免使用 merge 的完整流程
  • python学opencv|读取图像(六十七)使用cv2.convexHull()函数实现图像轮廓凸包标注
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_create_pool函数
  • 《第三代大语言模型Grok 3:闪亮登场》
  • OpenCV(1):简介、安装、入门案例、基础模块
  • Qt 中使用 SQLite 数据库的完整指南
  • DeepSeek 的创新融合:多行业应用实践探索
  • 网络安全攻防演练——RT实战技巧篇
  • ELK 日志收集框架搭建
  • 【博客之星】GIS老矣尚能饭否?WebGIS项目实战经验与成果展示
  • Oracle视图(基本使用)
  • qt实习总结
  • 内网下,Ubuntu (24.10) 离线安装docker最新版教程
  • 【踩坑实录】-Boundary Amount must be a positive integer, provided amount is: 0
  • 第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025)
  • Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)
  • VINS-mono代码笔记
  • Java 运行时常量池笔记(详细版
  • 第150场双周赛:好数字之和、分割正方形 Ⅰ、分割正方形 Ⅱ、最短匹配字符串
  • 音著协宣布胜诉,虎牙公司终审被判侵权
  • 永久基本农田竟沦为垃圾场,湖南湘潭回应:全面启动专项整治
  • 2025全球城市科技传播能力指数出炉,上海位列第六
  • 首映|《星际宝贝史迪奇》真人电影,不变的“欧哈纳”
  • “80后”萍乡市安源区区长邱伟,拟任县(区)委书记
  • 没有握手,采用翻译:俄乌三年来首次直接会谈成效如何?