描述

以前一直记得重写equals要把hashCode也要重写了,但是一直也是没有搞明白,

最近在看一些东西,觉得有必要记录一下。

了解一下equals

equals是Object类的方法,

equals是干什么用的

这个方法的作用是比较两个对象是否相等的,可能有人会问了,使用==号不就可以比较了,

为啥非得使用equals方法呢。

假设你有一个Student类,系统认为一个学生的学号只要相同就默认为是同一个学生,

public class Student {
private String IdCard;
}

如下:

Student xiaoming=new Student("110");

Student xm=new Student("110");

如果使用==判断得到的结果肯定是false,因为这是两个对象,地址肯定不相同。

如果重写equals方法

public class Student {
private String IdCard; @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return IdCard != null ? IdCard.equals(student.IdCard) : student.IdCard == null;
}
}

然后使用equals方法比较(xiaoming.equals(xm))就可以得到true。

但是为什么非得重写hashCode方法

因为不重写hashCode在使用Hash集合(HashMap、HashTable、HashSet)的时候会出现问题。

如果Student类重写了equals方法没有重写hashcode方法:

Student xiaoming=new Student("110");
Student xm=new Student("110");
HashMap<Student,String> map=new HashMap<Student,String>();
map.put(xiaoming,"小明");
map.put(xm,"小明");

执行map.size() 我们想要得到的结果是:1,但是执行的结果是:2 ;

这是因为hashmap首先比较的是两个对象的hashcode值,如果你没有重写Student类的hashCode方法,默认是按照对象内存的地址进行哈希运算得到的,这两个对象的地址肯定不一样,所以HashMap认为它不是同一个对象,就放入了集合中。

我们添加hashCode方法的重写:

public class Student {
private String IdCard; @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return IdCard != null ? IdCard.equals(student.IdCard) : student.IdCard == null;
} @Override
public int hashCode() {
return IdCard != null ? IdCard.hashCode() : 0;
}
}

再次执行上面的代码就得到的结果就是:1;说明已经认为这两个对象是同一个了。

建议

大家用IDE自动生成,尽量不要自己敲因为很有可能会出错。

重写equals为啥需要重写hashCode的更多相关文章

  1. 为什么重写equals时必须重写hashCode方法?(转发+整理)

    为什么重写equals时必须重写hashCode方法? 原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html ...

  2. 为什么重写 equals 方法 必须重写 hashCode

    自己学到这,就记录了下来,代码都是自己敲得,有不对的地方希望大神指点出来 为什么重写 equals 方法 必须重写 hashCode 如果你重写了equals,比如说是基于对象的内容实现的,而不重写 ...

  3. 讲解:为什么重写equals时必须重写hashCode方法

    一 :string类型的==和equals的区别: 结论:"=="是判断两个字符串的内存地址是否相等,equals是比较两个字符串的值是否相等,具体就不做扩展了,有兴趣的同学可以去 ...

  4. 为什么重写equals一定要重写hashCode?

    大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白,以下是我的一些个人理解. ...

  5. 为什么重写equals后要重写hashCode

    equals和hashCode的关系 要搞清楚题目中的问题就必须搞明白equals方法和hashCode方法分别是什么,和诞生的原因,当搞明白了这一点其实题目就不算是个问题了,下面我们来探讨分别探讨一 ...

  6. java中为什么重写equals时必须重写hashCode方法?

    在上一篇博文Java中equals和==的区别中介绍了Object类的equals方法,并且也介绍了我们可在重写equals方法,本章我们来说一下为什么重写equals方法的时候也要重写hashCod ...

  7. 为什么重写equals一定要重写hashCode方法?

    大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...

  8. java 中为什么重写 equals 后需要重写 hashCode

    本文为博主原创,未经允许不得转载: 1. equals 和 hashCode 方法之间的关系 这两个方法都是 Object 的方法,意味着 若一个对象在没有重写 这两个方法时,都会默认采用 Objec ...

  9. 编写高质量代码改善C#程序的157个建议——建议12: 重写Equals时也要重写GetHashCode

    建议12: 重写Equals时也要重写GetHashCode 除非考虑到自定义类型会被用作基于散列的集合的键值:否则,不建议重写Equals方法,因为这会带来一系列的问题. 如果编译上一个建议中的Pe ...

随机推荐

  1. hdu 1305 还是字典树

    #include<cstdio> #include<iostream> #include<string> #include<cstdlib> #defi ...

  2. Java并发(思维导图)【待评估、删除】

    1, 2, 3,常用函数 Semaphore import java.util.concurrent.Semaphore;Semaphore name=new Semaphore(n); name.a ...

  3. Windows编程 Windows程序的生与死(下)

    再谈程序之“死” 记得在第二回中我对程序的“死”只是一句话带过,因为我还没有铺垫好,好了现在我们可以详细的分析一下这个过程了. 这还要从while消息循环说起,还记得GetMessage函数吗?它是一 ...

  4. Ocelot + Consul的demo

    参考大佬的博客写的:https://www.cnblogs.com/alan-lin/p/9126155.html:也可以参考这篇博客:https://www.cnblogs.com/axzxs200 ...

  5. YOLO 学习之路

    参考自官网  https://pjreddie.com/darknet/install/ 1. 下载darknet  并编译 git clone https://github.com/pjreddie ...

  6. 二元变量图形的pandas方法

    数据加载: 1.散点图 上图使用下采样的方法选取了100个样本点,因为把所有的数据加载进来太多了. 2.Hexplot图 上图是一个散点图再加上热力标注的形式,可以更准确的帮助我们看出数据集中在哪些区 ...

  7. mpvue + 微信小程序 picker 实现自定义多级联动 超简洁

    微信小程序官网只提供了省市区的三级联动,实际开发中更多的是自定义的多级联动: 依照微信小程序官网提供的自定义多级联动,需要使用到picker 的多列选择器,即设置 mode = multiSelect ...

  8. php实现多进程、多线程

    孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程:一个进程使用f ...

  9. android程序复制数据库

    一般项目中我们把db文件放到assert或者raw目录下面,在程序第一次启动的时候复制到私有目录下面 在使用过程中,老是发现复制不成功,私有目录下的db文件总是3072 后来发现应该是使用Conten ...

  10. 2.1 使用JAXP 对 xml文档进行DOM解析

    //使用 jaxp 对xml文档进行dom解析 public class Demo2 { //必要步骤 @Test public void test() throws Exception { //1. ...