解决idea默认带的equals和hashcode引起的bug

 更新时间:2021年07月27日 11:25:21   作者:thisisnew  
这篇文章主要介绍了解决idea默认带的equals和hashcode引起的bug,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

idea默认带的equals和hashcode引起的bug

最近因规范需要,统一使用idea,使用的版本为2017.4.

建立一个实体类,在添加的时候,使用idea的快捷键自动生成了equals和hashcode方法.

选择2个属性进行生成

然后往list中添加,结果一直出现重复记录,调试半天发现

if(!super.equals(o)) return false;这一句是进行引用比较,如果同一个类,直接返回,导致出现问题。

按理说我选择属性进行比对,肯定是不可能是相同引用了,所以2017.3.4分版本的自动生成equals和hashcode请慎

正确的应该如下

关于equals和hashcode问题

默认情况下也就是从超类Object继承而来的equals方法与‘=='是完全等价的,比较的都是对象的内存地址,但我们可以重写equals方法,使其按照我们的需求的方式进行比较,如String类重写了equals方法,使其比较的是字符的序列,而不再是内存地址。

hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。

这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java IO流 文件的编码实例代码

    Java IO流 文件的编码实例代码

    本文通过实例代码给大家介绍了java io流文件编码的方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-05-05
  • springcloud项目快速开始起始模板的实现

    springcloud项目快速开始起始模板的实现

    本文主要介绍了springcloud项目快速开始起始模板思路的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 一种类似JAVA线程池的C++线程池实现方法

    一种类似JAVA线程池的C++线程池实现方法

    线程池(thread pool)是一种线程使用模式。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能。这篇文章主要介绍了一种类似JAVA线程池的C++线程池实现方法,需要的朋友可以参考下
    2019-07-07
  • springboot 通过代码自动生成pid的方法

    springboot 通过代码自动生成pid的方法

    这篇文章主要介绍了springboot 通过代码自动生成pid的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • java实现的AES秘钥生成算法示例

    java实现的AES秘钥生成算法示例

    这篇文章主要介绍了java实现的AES秘钥生成算法,结合实例形式分析了AES秘钥生成算法原理与实现技巧,需要的朋友可以参考下
    2017-01-01
  • mybatis定义sql语句标签之delete标签解析

    mybatis定义sql语句标签之delete标签解析

    这篇文章主要介绍了mybatis定义sql语句标签之delete标签解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 详解Spring DI依赖注入的方式和类型

    详解Spring DI依赖注入的方式和类型

    这篇文章主要介绍了详解Spring DI依赖注入的方式和类型,DI是由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台,需要的朋友可以参考下
    2023-05-05
  • Java中构造方法set/get和toString的使用详解

    Java中构造方法set/get和toString的使用详解

    这篇文章主要介绍了Java中构造方法set/get和toString的使用详解,构造函数的最大作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化,需要的朋友可以参考下
    2019-07-07
  • SpringBoot简单使用SpringData的jdbc和durid

    SpringBoot简单使用SpringData的jdbc和durid

    今天给大家带来的是关于Java的相关知识,文章围绕着SpringBoot简单使用SpringData的jdbc和durid,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java mybatis常见问题及解决方案

    Java mybatis常见问题及解决方案

    这篇文章主要介绍了Java mybatis常见问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08

最新评论