解决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类),将会存储了两个值一样的对象。

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

(0)

相关推荐

  • 如何在IDEA中对 hashCode()和 equals() 利用快捷键快速进行方法重写

    在Java中对集合进行操作时,有时候需要对类中的equals() 和 hashCode()进行方法重写.IDEA中实现了利用快捷键即可对上述内容进行快速操作.如下,我们定义一个名为Student的类. 下面我们利用快捷键对equals() 和 hashCode()方法进行重写 按住alt+Inset键会出现下面一个弹框 接着进行如下操作 IDEA自动生成了下面的方法 这样就完成了hashCode()和 equals() 方法的简单重写. 另外补充一句,HashSet集合保证元素的唯一性依赖两个方

  • 详解hashCode()和equals()的本质区别和联系

    在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equals是Object类提供的方法之一,众所周知,每一个java类都继承自Object类,所以说每一个对象都有equals这个方法.而我们在用这个方法时却一般都重写这个方法,why? 先看一个Object类中equals()方法的源代码: public boolean equals(Object ob

  • java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是Object.equals方法了.但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了. 也就是说,如果集合中现在已经有

  • 浅谈String类型等值比较引起的“==”、“equals()”和“hashCode”思考

    关于String类型的等值比较和内容比较,是学习java甚至任何编程语言所共同的常见问题,理解String类型的等值比较和内容比较也是面试经常问到的问题. String类型的等值比较和内容比较 字符串等值比较 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ pr

  • Java equals 方法与hashcode 方法的深入解析

    PS:本文使用jdk1.7解析1.Object类 的equals 方法 复制代码 代码如下: /**     * Indicates whether some other object is "equal to" this one.     * <p>     * The {@code equals} method implements an equivalence relation     * on non-null object references:     * &l

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

    idea默认带的equals和hashcode引起的bug 最近因规范需要,统一使用idea,使用的版本为2017.4. 建立一个实体类,在添加的时候,使用idea的快捷键自动生成了equals和hashcode方法. 选择2个属性进行生成 然后往list中添加,结果一直出现重复记录,调试半天发现 if(!super.equals(o)) return false:这一句是进行引用比较,如果同一个类,直接返回,导致出现问题. 按理说我选择属性进行比对,肯定是不可能是相同引用了,所以2017.3.

  • 探索Java中的equals()和hashCode()方法_动力节点Java学院整理

    equals()和hashCode()区别?  equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值.  hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数.根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的:当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了. 之所以有hashCode方法,是因为在批量的对象比

  • java集合——Java中的equals和hashCode方法详解

    Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用. equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复. 这里我们首先要明白一个问题: equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等.换

  • 深入理解equals和hashCode方法

    前言 在程序设计中,有很多的"公约",遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范. Object类是Java中的万类之祖,其中,equals和hashCode是2个非常重要的方法. 这2个方法总是被人放在一起讨论.最近在看集合框架,为了打基础,就决定把一些细枝末节清理掉.一次性搞清楚! 下面开始剖析. public boolean equals(Object obj) Object类中默认的实现方式是 : return this == obj .那就是说

  • django 解决扩展自带User表遇到的问题

    首先要扩展自带的auth_user表我就放个图吧, 同时setting中应该设置: # 此处重载是为了使UserProfile生效 AUTH_USER_MODEL = "EcdsApp.UserProfile" 本人的项目需要对此表进行扩展,再建两个子表关联这个表,关联关系为一对一: 修改完成之后进行子表关联: from django.contrib.auth.models import AbstractUser, User from django.conf import settin

  • 解决Keras自带数据集与预训练model下载太慢问题

    keras的数据集源码下载地址太慢.尝试过修改源码中的下载地址,直接报错. 从源码或者网络资源下好数据集,下载好以后放到目录  ~/.keras/datasets/    下面. 其中:cifar10需要改文件名为cifar-10-batches-py.tar.gz ,cifar100改为 cifar-100-python.tar.gz , mnist改为 mnist.npz 预训练models放到 ~/.keras/models/ 路径下面即可. 补充知识:Keras下载的数据集以及预训练模型

  • Java中==与equals()及hashcode()三者之间的关系详解

    目录 1.= = 2.equals() 3.重写equals() 4.equals()比较流程 5.hashcode() 1.= = =为赋值运算符,==为比较运算符,仅比较对象的内存地址,无法比较真正意义上的相等! JDK里的equals方法就是通过==来实现的比较对象的内存地址 以Integer为例 Integer a = 127; Integer b = 127; System.out.println(a == b);//true Integer c = 128; Integer d =

  • Python使用defaultdict解决字典默认值

    目录 1.导入defaultdict 2.创建defaultdict 3.使用defaultdict 4.添加defaultdict默认值 5.结论 在Python中,defaultdict是一种特殊类型的字典,它可以自动为字典中不存在的键设置默认值.这种类型的字典是在collections模块中定义的.它为我们提供了一个更方便,更容易使用的字典.在这篇文章中,我们将深入探讨Python中的defaultdict,并探讨如何使用它们. 1.导入defaultdict 我们需要先导入包含defau

  • JS解决IOS中拍照图片预览旋转90度BUG的问题

    上篇文章[Js利用Canvas实现图片压缩功能]中做了图片压缩上传,但是在IOS真机测试的时候,发现图片预览的时候自动逆时针旋转了90度.对于这个bug,我完全不知道问题出在哪里,接下来就是面向百度编程了.通过度娘找到了相关资料,解决方法记录在此.这个问题的具体因素其实我还是不清楚是为何导致的,只有IOS和部分三星手机会出现此bug. 绝大部分的安卓机并无此问题. 解决此问题需要引入一个第三方 JS 库: exif.js 下载地址:https://github.com/exif-js/exif-

随机推荐