一、场景复现

创建两个lombok的@Data注解的类Pig实例,放进HashMap当key,map里面的数据居然被覆盖了。

package com.mk;import lombok.Data;
@Data
public class Pig extends Animal{private String sex;
}
package com.mk;import java.util.HashMap;
import java.util.Map;public class TestLombok {public static void main( String[] args ) {Pig aPig = new Pig();aPig.setName("A");aPig.setColor("white");aPig.setSex("male");Pig bPig = new Pig();bPig.setName("B");bPig.setColor("black");bPig.setSex("male");Map<Pig, String> map = new HashMap<>();map.put(aPig, "1");map.put(bPig, "2");System.out.println("map.size():"+map.size());System.out.println("map.get(aPig):"+map.get(aPig));System.out.println("map.get(bPig):"+map.get(bPig));System.out.println("map.keySet().iterator().next().getName():" + map.keySet().iterator().next().getName());System.out.println("aPig.equals(bPig):"+aPig.equals(bPig));}
}
package com.mk;
import lombok.Data;
@Data
public abstract class Animal {private String name;private String color;
}

运行结果:

map.size():1
map.get(aPig):2
map.get(bPig):2
map.keySet().iterator().next().getName():A
aPig.equals(bPig):true

百思不得其解,明明没有重写hashcode和equals方法,却返回true

通过反编译生成的class,可以看得lombok帮类文件生成hashcode和equals方法。hashcode和equals方法使用类声明的所有属性方法生成的(不包含继承的父类属性方法

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package com.mk;public abstract class Animal {private String name;private String color;public Animal() {}public String getName() {return this.name;}public String getColor() {return this.color;}public void setName(String name) {this.name = name;}public void setColor(String color) {this.color = color;}public boolean equals(Object o) {if (o == this) {return true;} else if (!(o instanceof Animal)) {return false;} else {Animal other = (Animal)o;if (!other.canEqual(this)) {return false;} else {Object this$name = this.getName();Object other$name = other.getName();if (this$name == null) {if (other$name != null) {return false;}} else if (!this$name.equals(other$name)) {return false;}Object this$color = this.getColor();Object other$color = other.getColor();if (this$color == null) {if (other$color != null) {return false;}} else if (!this$color.equals(other$color)) {return false;}return true;}}}protected boolean canEqual(Object other) {return other instanceof Animal;}public int hashCode() {int PRIME = true;int result = 1;Object $name = this.getName();int result = result * 59 + ($name == null ? 43 : $name.hashCode());Object $color = this.getColor();result = result * 59 + ($color == null ? 43 : $color.hashCode());return result;}public String toString() {return "Animal(name=" + this.getName() + ", color=" + this.getColor() + ")";}
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package com.mk;public class Pig extends Animal {private String sex;public Pig() {}public String getSex() {return this.sex;}public void setSex(String sex) {this.sex = sex;}public boolean equals(Object o) {if (o == this) {return true;} else if (!(o instanceof Pig)) {return false;} else {Pig other = (Pig)o;if (!other.canEqual(this)) {return false;} else {Object this$sex = this.getSex();Object other$sex = other.getSex();if (this$sex == null) {if (other$sex != null) {return false;}} else if (!this$sex.equals(other$sex)) {return false;}return true;}}}protected boolean canEqual(Object other) {return other instanceof Pig;}public int hashCode() {int PRIME = true;int result = 1;Object $sex = this.getSex();int result = result * 59 + ($sex == null ? 43 : $sex.hashCode());return result;}public String toString() {return "Pig(sex=" + this.getSex() + ")";}
}

二、解决方案

(1)不使用lombok对子类进行生成属性方法

(2)lombok生成属性方法的子类不能使用map、set等集合使用的hashcode和equals方法。

Lombok的@Data生成的hashCode和equals方法坑相关推荐

  1. Java中hashCode和equals方法的正确使用

    在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: 1.ha ...

  2. 理解Java中的hashCode 和 equals 方法

    2019独角兽企业重金招聘Python工程师标准>>> 在Java里面所有的类都直接或者间接的继承了java.lang.Object类,Object类里面提供了11个方法,如下: 1 ...

  3. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写 hashcode 和 equals 方法?...

    1. 通过Hash算法来了解HashMap对象的高效性 2. 为什么要重写equals和hashCode方法 3. 对面试问题的说明 <Java 2019 超神之路> <Dubbo ...

  4. HashMap存自定义对象为什么要重写 hashcode 和 equals 方法?

    HashMap的k放过自定义对象么? 当我们把自定义对象存入HashMap中时,如果不重写hashcode和equals这两个方法,会得不到预期的结果. class Key{private Integ ...

  5. 为什么要重写 hashcode 和 equals 方法?

    我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有 ...

  6. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写hashcode和equals方法?你能说清楚了吗...

    我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有 ...

  7. HashMap存储自定义类型键值: 重写HashCode和equals方法

    一个团体作为一个HashMap的key值,若团体成员的姓名年龄相同,则看作key值相同 因为是自定义类,所以需要重写HashCode和equals方法 public class RedVelvet { ...

  8. Java重写hashcode()与equals()方法

    一. hashCode 1. 基本概念 hashCode 是 JDK 根据对象的地址算出来的一个 int 数字(对象的哈希码值),代表了该对象再内存中的存储位置. hashCode() 方法是超级类 ...

  9. 026_使用eclipse生成hashCode和equals方法

    1. 使用eclipse生成hashCode方法, 模拟一个两个对象实例不同, hashCode形同, 两个对象的equals方法返回flase的场景. 1.1. People类 public cla ...

最新文章

  1. Python | 用PrettyPrinter,让Python输出更漂亮,你值得拥有
  2. Nature:环境vs基因,谁对肠道菌群影响更大?
  3. 生物信息「知识图谱」
  4. texlive安装需要多久_LaTex编译环境安装与使用
  5. 屏幕录像 Camstudio
  6. pyinstaller 打包
  7. android 非root app 捕捉系统广播_APP的生死之道
  8. 打卡学习 | Redis原理应用-线程IO模型
  9. Linux下的iscsi(设备的共享服务)
  10. python课程-Python课程学习总结
  11. 快速求实对称矩阵特征向量的技巧
  12. 四、OSPF配置实验
  13. linux下安装nginx
  14. 马氏距离Mahalanobis Distance实例
  15. linux dolphin模拟器,dolphin模拟器32位64位
  16. 网易邮箱注册HTML+CSS
  17. javascript英语单词音节拆分_拆分音节拼读法解析
  18. 银行HR讲述实习生转正故事:寒门真的再难出贵子
  19. 按键状态机—实现连发
  20. 【AR】开始使用Vuforia进行Android开发(3)

热门文章

  1. 在oracle中游标的操作,Oracle中的游标和函数详解
  2. ndr4108贴片晶振是多少频率_关于山羊挺身你知道多少?这些干货速来了解一下...
  3. [JavaWeb-Bootstrap]Bootstrap响应式布局
  4. [蓝桥杯2019初赛]修改数组-并查集
  5. SpringBoot项目新手——问题疑惑及解决笔记
  6. 反转字符串中的单词 III leetcode
  7. Battlestation Operational HDU 6134
  8. 模板:Prime最小生成树堆优化 + Dijkstra单源最短路堆优化
  9. 2021牛客暑期多校训练营3 C Minimum grid 网络流 + 二分图匹配
  10. 【洛谷P5385】须臾幻境/【BZOJ3514】Codechef MARCH14 GERALD07加强版【LCT】【主席树】