描述

以前一直记得重写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. grpc的demo

    一 grpc的为什么比http快? 1- 用Proto Buffer 作为序列化工具 2- 采用http2协议,头部压缩,多路复用 3- 基于netty的IO框架 二 grpc的demo A lib工 ...

  2. c#连接数据库SqlHelper报错

    这是一个困扰了我好几天的问题,首先看一下报错信息 代码: private static string connectionString = ConfigurationManager.Connectio ...

  3. LINQ 多条件join on

    var  tmp = from a in DT1.AsEnumerable() join b in DT2.AsEnumerable() on new { bm = a.Field<string ...

  4. C++性能榨汁机之虚函数的开销

    C++性能榨汁机之虚函数的开销 来源  http://irootlee.com/juicer_vtable/ 虚函数的实现 虽然C++标准并没有规定编译器实现虚函数的方式,但是大部分编译器均是采用了虚 ...

  5. sipp如何避免dead call

    uac 和 uas 都加上  -deadcall_wait 0

  6. java读取串口-mfz-rxtx-2.2-20081207-win-x86

    1.下载jar包 RXTXcomm.jar 2.实现代码 package main; import java.awt.*; import java.awt.event.*; import java.i ...

  7. RPC、RMI、REST的区别

    初入职场,接触了不少企业常用的技术,与学校实训使用的技术有很大差异,在这里记录一下RPC.RMI与REST的区别. 概念 RPC(Remote Procedure Call,远程过程调用) 一种通过从 ...

  8. [react] - 循环请求 redux-saga

    //根据uuid 获取 apt报告信息 *getNotesByUid({ payload, callback }, { call, put }) { // payload 是个数组, 并发执行,参考r ...

  9. python实现IP地址转换为32位二进制

    python实现IP地址转换为32位二进制 #!/usr/bin/env python # -*- coding:utf-8 -*- class IpAddrConverter(object): de ...

  10. SELinux 了解及CentOS7 中 semanage命令的安装

    SELinux 安全子系统 SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access ...