首先从源码的角度来看一看equals()方法的hashcode()方法的含义

equals()方法和hashcode()方法都属于Object类,在Java中,所有的类都是Object类的子类,也就是说,任何Java对象都可调用Object类的方法。

equals()方法:

public boolean equals(Object obj) {return (this == obj);
}

很明显,该方法就是用来判断两个对象是否是同一个对象。在Object类源码中,其底层是使用了“==”来实现,也就是说通过比较两个对象的内存地址是否相同判断是否是同一个对象,实际上,该equals()方法通常没有太大的实用价值。而我们往往需要用equals()来判断 2个对象在逻辑上是否等价,而非验证它的唯一性。这样我们在实现自己的类时,就要重写equals()方法。

hashcode()方法:

public native int hashCode();

一提到hashcode,很自然就想到哈希表。将某一key值映射到表中的一个位置,从而达到以O(1)的时间复杂度来查询该key值。Object类源码中,hashCode()是一个native方法,哈希值的计算利用的是内存地址。

我们看一下Object类中关于hashCode()方法的注释

1.在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

2.如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

3.如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

通俗的讲,注释中第二点和第三点的含义就是equals()和hashcode()方法要保持相当程度的一致性,equals()方法相等,hashcode()必须相等;反之,equals方法不相等,hashcode可以相等,可以不相等。但是两者的一致有利于提高哈希表的性能。

所以,源码注释来看,两方法的同时重写是很必要的。

实际来看,不同时重写如何?

equals()相等的的两个等价对象因为hashCode不同,所以在hashmap中的table数组的下标不同,从而这两个对象就会同时存在于集合中,在调用hashmap集合中的方法时就会出现逻辑的错误,也就是,你的equals()方法也“白白”重写了。

因此,对于“为什么重写equals()就一定要重写hashCode()方法?”这个问题应该是有个前提,就是你需要用到HashMap,HashSet等Java集合。用不到哈希表的话,其实仅仅重写equals()方法也可以吧。而工作中的场景是常常用到Java集合,所以Java官方建议重写equals()就一定要重写hashCode()方法。

创作不易,希望有收获的朋友点赞关注!

hashcode值一样对象一定相同吗_为什么重写equals()方法就必须重写hashcode()方法?...相关推荐

  1. hashcode值一样对象一定相同吗_HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  2. java -为什么重写equals(),还需要重写hashCode()?

    1.先post这两个方法的基本定义: equals()的定义: 浅谈Java中的equals和==(转) hashCode()的定义: java中hashCode()方法的作用 Java中hashCo ...

  3. 为什么重写equals()就一定要重写hashCode()方法

    Object类,所有类的父类 一.为什么重写equals()方法一定要重写hashCode()方法 1.首先解释equals方法和hashcode方法分别是用来干什么的? equals()方法: 在O ...

  4. why在重写equals时还必须重写hashcode方法

    首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...

  5. doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)

    在日常工作中我们经常会与数组打交道,因此需要熟练掌握数组操作的相关方法,ES6中关于数组的操作,又给我们带来了哪些惊喜呢,Array数组操作又添加了哪些新方法? 本篇文章将从以下几个方面进行介绍: A ...

  6. JAVA中重写equals()方法的同时要重写hashcode()方法

    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...

  7. 重写 equals 方法就一定要重写 hashCode 方法?其实有个前提

    作者 l 会点代码的大叔(CodeDaShu) 如果问到 == 和 equals 的区别,相信很多程序员同学都能脱口而出:一个是判断地址,一个是判断内容. 但是如果继续追问:"你重写过 eq ...

  8. java比较两个对象重写,不重写equals进行两个对象间的深度比较

    背景 我们知道在Java中比较两个对象是否相同,可以有多种方法,最常见的就是 == 和 equals 方法.但是由于==对比的是对象引用本身,因此重写equals才是最常用和可靠的比较两个对象是否相同 ...

  9. 面试官:重写 equals 时为什么一定要重写 hashCode?

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,关注 ...

  10. 为什么重写equals方法时,要求必须重写hashCode方法?

    1 equals方法 Object类中默认的实现方式是  :   return this == obj  .那就是说,只有this 和 obj引用同一个对象,才会返回true. 而我们往往需要用equ ...

最新文章

  1. 计算机视觉系统中图像究竟经历了哪些“折磨”
  2. 【控制】《多无人机协同控制技术》周伟老师-第5章-基于滑模控制的无人机编队运动控制策略
  3. linux网络协议栈之数据包处理过程,Linux网络协议栈之数据包处理过程
  4. camunda流程引擎如此简单「四」
  5. 面试官最爱问的并发问题
  6. Windows 10 搭建Python3 安装使用 protobuf
  7. 安装指定的vue-router版本
  8. 面向服务架构(SOA)和企业服务总线(ESB)
  9. CF 86D 莫队(卡常数)
  10. Delphi语言基础
  11. [附源码]计算机毕业设计springboot咖啡销售平台
  12. 单片机应用系统设计技术——LCD滚动显示汉字
  13. Kali Linux系统正确安装指南教程(一)MAC安装kail+Vmware Fusion详细教程(吐血本人测试10次)
  14. 海外手机号码正则匹配
  15. python富翁与穷人_穷人和富人最根本的区别
  16. 一文搞懂k近邻(k-NN)算法(一)
  17. 抖音短视频SEO优化排名方法
  18. 功率曲线k值_功率曲线的修正
  19. [InteliJ IDEA] 系统资源不足
  20. STM32F4_时钟系统精讲

热门文章

  1. android 蒙版图片带拖动_「ps|pr」大概ps的剪切蒙版和pr的轨道遮罩键是兄弟吧
  2. nodejs mysql 增删改查_#NodeJS# MySQL的介绍安装使用以及使用NodeJS链接MySQL实现增删改查...
  3. mysql_TCL语言(事务)
  4. 图片渲染延迟_Qt入门DirectX11学习之旅(六)DirectX11 GBuffer Deffered延迟渲染
  5. 算法java人工智能_人工智能用的编程语言是哪些?
  6. C语言(面积计算器)不能输入负数[程序以要求]
  7. A. Death Note
  8. semaphore的几种用法
  9. POJ 2686 Traveling by Stagecoach
  10. Word2vector原理