equals和hashcode是object类下一个重要的方法,而object类是所有类的父类,所以所有的类都有这两个方法

equals和hashcode间的关系:

1.如果两个对象相同(即equals比较返回true),那么他们的hashcode一定要相等

2.如果他们的hashcode相等,他们的equals不一定相等

假设两个对象,重写了其equals方法,其相等条件是属性相等,equals比较之后返回true说明假设的两个对象相等,如果没有重写hashcode的话,其返回的依然是两个对象的内存地址,那么他们的hashcode不相同,这和上面的equals和hashcode间的关系相矛盾!

思维发散与点滴感悟:

由于为了提高程序的效率才实现了hahscode方法,先进行hashcode比较,如果不同就没必要进行equals比较了,这样大大减少了equals比较的次数,当比较的数量大的时候提高的效率就很可观!比如在set集合中:

java中set集合是无序的,不能重复,那怎么保证不重复呢?单靠equals方法比较的话,如果集合中本来就有100000个元素,现在放入1000个元素,难道要将前面所有的元素都进行比较一遍?OMGD,这个效率是超级慢的,因此hashcode就大显身手了,java采用了hash表,利用了hash算法(散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么后面进来的数据只要看对应的hashcode地址上是否有值,没有的话就直接插入,有的话不进行任何操作,这样就大大减少了equals的比较次数(因为两个不同的对象其hash也可能是相等的,所有还是需要进行equals的比较的,这样效率就大大提高了!

所以总结回答一下:为什么重写equals还要重写hashcode???

其实简单的说就为了保证同一个对象,保证在equals相等的情况下hashcode值必定相等,如果重写了equals而没有重写hashcode的话,可能会出现两个没有关系的对象equals相等(equals根据特征值进行比较),但hashcode不相同的情况,违背了equals和hashcode间的关系!

为什么重写equals还要重写hashcode??的更多相关文章

  1. 为什么重写equals还要重写hashcode

    参考回答: HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两 ...

  2. 【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明

    在项目开发中,我们都有这样的经历,就是在新增表时,会相应的增加java类,在java类中都存在常见的几个方法,包括:equals(),hashcode(),toString() ,compareto( ...

  3. 为什么重写equals必须重写hashCode

    目录 equals常见面试题 为什么要重写equals 重写equals不重写hashCode会存在什么问题 总结 equals常见面试题 在开始聊之前,我们先看几个常见的面试题,看看你能不能都回答上 ...

  4. 为什么重写equals必须重写hoshCode的基础分析

    为什么重写equals必须重写hoshCode的基础分析 1.我们先来了解下原生的equals和hashCode代码 原生equals:它判断的是两个对象是否相等 原生hashCode值:它是根据内存 ...

  5. 为什么要重写equals()方法与hashCode()方法

    在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写equals方法我们是继承了object ...

  6. 【Java基础】重写equals需要重写hashcode

    Object里的equals用来比较两个对象的相等性,一般情况下,当重写这个方法时,通常有必要也重写hashcode,以维护hashcode方法的常规协定,或者说这是JDK的规范,该协定声明相等对象必 ...

  7. Hibernate中为什么要重写equals方法和hashcode方法

    1.*为什么要重写equals方法,首先我们来看一下equals源码: public boolean equals(Object anObject) { if (this == anObject) { ...

  8. 为什么重写equals()必须重写hashCode()

    主要原因是因为hashCode是用对象的内部地址转换成一个整数的,而equals比较得是两个对象,或者是两个对象的内容 如果你重写了equals,而保留hashCode的实现不变,那么很可能两个对象明 ...

  9. JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法

    在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { priva ...

随机推荐

  1. HDU6186(线段树)

    CS Course Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. vue2.0父子组件通信的方法

    vue2.0组件通信方法:props传值和emit监听.(.sync方法已经移除.详情请点击)(dispatch-和-broadcast方法也已经废弃) props方法传值:Props 现在只能单项传 ...

  3. Javascript 随机数函数 学习之二:产生服从正态分布随机数

    一.为什么需要服从正态分布的随机函数 一般我们经常使用的随机数函数 Math.random() 产生的是服从均匀分布的随机数,能够模拟等概率出现的情况,例如 扔一个骰子,1到6点的概率应该相等,但现实 ...

  4. 一步步弄懂HTTPS

    为什么要使用HTTPS? HTTP采用明文传输,存在被监听.内容被篡改.身份被冒充的可能.为了保证安全性,需要对数据进行加密,这便有了HTTPS. 一步步分析HTTPS 1. 采用哪种加密方式加密数据 ...

  5. 获取和添加URL地址栏参数

    URL地址(添加参数:传参) js写法: //1.window.location.href var a ="1018802,8" var b ="1" wind ...

  6. Tronado自定义Session

    这里就不一一诉说Session和Cookie直接的关系了,下面以一张图来概括: 下面是一个简单的Tornaod自定义Session的例子,看完后你可能会明白为什么我们在Django里可以直接使用req ...

  7. VC工程从Win32环境往Win64环境迁移的经验总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 首先需要安装Win64的开发环境,具体参考: VS 2008的64位编译环境的安装和使用 其次在工程属性设置中作如下修 ...

  8. 火狐浏览器sqlite插件

    https://addons.mozilla.org/zh-cn/firefox/addon/sqlite-manager/

  9. Unity Profiler CPU Usage(CPU使用情况)

    在Profiler界面点击左侧CPU Usage,Profiler界面下方Hierarchy窗口会列出各个函数对当前CPU的耗时,从大到小排序. 然后分析,各个函数的耗时是否异常,分析有没有可以优化的 ...

  10. maven学习笔记--maven项目创建

    使用Maven命令和Eclipse的Maven插件,创建Maven项目 (1)maven命令生成项目         新建一个文件目录,dos进入该目录并执行下面命令: mvn archetype:c ...