当前位置:   article > 正文

Lombok注解之:EqualsAndHashCode使用说明_lombok equalsandhashcode

lombok equalsandhashcode

Lombok注解之:EqualsAndHashCode使用说明

结论

  1. @Data注解集成了@Getter、@Setter、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode,其中@EqualsAndHashCode的callSuper属性默认是false
  2. @EqualsAndHashCode注解的callSuper属性表示在equals、hsahCode方法中是否会引用当前类的父类中的属性
  3. @EqualsAndHashCode注解的of属性表示在equals、hsahCode方法中仅会使用到of数组中指定的属性;【of属性值应该只能填子类中有的属性,填父类属性无效】

代码演示

Animal类(父类):

package com.yyh;

import lombok.Data;
/**
 * 动物类
 * @Author: yyh
 * Date: 2022/5/21
 * Time: 8:03
 */
@Data
public class Animal {
    /**
     * 名称
     */
    private String name;
    /**
     * 颜色
     */
    private String color;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Cat类(子类):

package com.yyh;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 猫类
 * @Author: yyh
 * Date: 2022/5/21
 * Time: 8:04
 */
@Data
public class Cat extends Animal {
    /**
     * 价格
     */
    private Double price;
    /**
     * 雌雄性别
     */
    private String sex;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

测试一:
当Cat类上只有@Data注解,也就相当于:
@EqualsAndHashCode(callSuper=false)

package com.yyh;

/**
 * @Author: yyh
 * Date: 2022/4/30
 * Time: 22:23
 */
public class TestLombok {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        cat1.setName("小白");
        cat1.setColor("白");
        cat1.setPrice(88d);
        cat1.setSex("雌");

        Cat cat2 = new Cat();
        cat2.setName("小蓝");
        cat2.setColor("蓝");
        cat2.setPrice(88d);
        cat2.setSex("雌");

        System.out.println(cat1.equals(cat2));   //true
        System.out.println(cat1 == cat2);   //false
    }
}
【说明】@EqualsAndHashCode(callSuper="false")时,即在equals、hashCode方法中不会引用父类Animal中的nama、color属性,所有即使
cat1、cat2的name、color属性不同,仅子类Cat中的price、sex属性
相同时,cat1.equals(cat2)结果为true;
cat1==cat2比较地址,所有肯定为false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

测试二:
当Cat类上除了@Data注解外,还有
@EqualsAndHashCode(callSuper=true)

package com.yyh;

import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * 猫类
 * @Author: yyh
 * Date: 2022/5/21
 * Time: 8:04
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class Cat extends Animal {
    /**
     * 价格
     */
    private Double price;
    /**
     * 雌雄性别
     */
    private String sex;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
package com.yyh;

/**
 * @Author: yyh
 * Date: 2022/4/30
 * Time: 22:23
 */
public class TestLombok {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        cat1.setName("小白");
        cat1.setColor("白");
        cat1.setPrice(88d);
        cat1.setSex("雌");

        Cat cat2 = new Cat();
        cat2.setName("小蓝");
        cat2.setColor("蓝");
        cat2.setPrice(88d);
        cat2.setSex("雌");

        System.out.println(cat1.equals(cat2));   //false
        System.out.println(cat1 == cat2);   //false

    }
}
【说明】@EqualsAndHashCode(callSuper = true),则会引用到父类Animal中的color、name属性,因cat1、cat2的name、color属性值不同,即使子类Cat的price、sex属性值相同,最终cat1.equals(cat2)结果为false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

测试三:
当Cat类上除了@Data注解外,还有
@EqualsAndHashCode(callSuper = true, of = {“price”})

package com.yyh;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 猫类
 * @Author: yyh
 * Date: 2022/5/21
 * Time: 8:04
 */
@Data
@EqualsAndHashCode(callSuper = true, of = {"price"})
public class Cat extends Animal {
    /**
     * 价格
     */
    private Double price;
    /**
     * 雌雄性别
     */
    private String sex;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
package com.yyh;



/**
 * @Author: yyh
 * Date: 2022/4/30
 * Time: 22:23
 */
public class TestLombok {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        cat1.setName("小蓝");
        cat1.setColor("蓝");
        cat1.setPrice(88d);
        cat1.setSex("雌");

        Cat cat2 = new Cat();
        cat2.setName("小蓝");
        cat2.setColor("蓝");
        cat2.setPrice(88d);
        cat2.setSex("雄");

        System.out.println(cat1.equals(cat2));   //true
        System.out.println(cat1 == cat2);   //false

    }
}
【说明】@EqualsAndHashCode(callSuper = true, of = {"price"}),
callSuper = true表示会引用到Animal中的name、color属性,此处cat1、cat2
对象的name、color值相同;
of = {"price"}表示equals、hashCode方法仅使用Cat类中的price属性作比较,
此处cat1、cat2的price值也相同,尽管sex属性不相同,但是equals()结果却是true;因为of属性指定了price属性,所有只要是price属性值相同时,equals()方法就返回true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/650575
推荐阅读
  

闽ICP备14008679号