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

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

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

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

选择2个属性进行生成

解决idea默认带的equals和hashcode引起的bug_第1张图片

解决idea默认带的equals和hashcode引起的bug_第2张图片

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

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

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

正确的应该如下

解决idea默认带的equals和hashcode引起的bug_第3张图片

关于equals和hashcode问题

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

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

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

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

你可能感兴趣的:(解决idea默认带的equals和hashcode引起的bug)