入行快要两年,偶尔想起来equals和hash还是会有些晕,索性今天就更深入的弄明白一些,不足之处也请各位大神指出批评,共同进步。

刚开始学java的时候只是记忆性的来背,如果一个类在程序中可能进行比较,那么就要重写equals和hashCode方法。但是无论如何都不能明白,而以前理解equals和hashCode都是看着eclipse工具自动生成的来理解,所以一直没看懂,觉得eclipse重写的equals和hashCode并没有 什么关系,为什么要重写。下面贴上eclipse工具重写的equals和hashCode方法进行说明

先来看equals方法

可以看到  第一个if判断使用this == obj  来判断,第二和第三就不用说了,第四个用的是id属性的值来用==比较,否则就返回true。 按照我以前的误解,既然这两个方法要一块重新写,那么equals就会用到hashCode才合理。 所以我想说,我们应该把equals来当做一个普通的方法来看待,不要觉得特殊,上述图片的写法只是eclipse工具的写法,如果你觉得不舒服那么就完全可以按照自己的逻辑算法来实现equals的比较逻辑只要保证equals的四原则即可。而equals和hashCode并不是相互依赖的关系。

再看hashCode

我们从图片中可以看到eclipse在重写hashCode方法时会让我们选择需要添加的属性,这里只用了id(因为一般的id属性是唯一的),eclipse重写的hashCode方法按照自己的算法计算除了一个值并返回给了调用者,而这个hashCode方法实际是准备给将来如果这个实体类被用到了Map或者List中来用的。下面来普及一下HashMap的数据结构

HashMap数据结构

我们都知道HashMap的结构是数组加链表,即每个数组元素中都是一个链表。

存值时: 调用key的HashCode方法来计算出一个哈希值然后通过算法计算出要存放位置的数组下标(具体算法还没详细追究)。然后将key放入这个下标对应的元素中的链表中,但是如果这时候key冲突就会用equals来比较key地址所对应的value,如果value不相等那么就用链地址法来解决key冲突,如果value相等那么就会把key替换掉。所以这里就用到了HashCode以及equals,如果不重写那么就会调用Object的方法,也就是用地址比较(这是肯定不行的)。一般的我们用String类型字符串来作为key,实体类作为value,但是String类已经重写了HashCode,所以自己的类一般要重写equals,但是我们知道map中的key是可以存放对象的,当map的key存放的是自己的类的对象时,那么这时候HashCode方法就起作用了,如果不重写,那么就会导致hash值错乱。从而导致不能在map中准确的拿到数据。

结语:

  到这里,关于equals和hashCode就讲完了。这里只是针对这两个方法的整体的思路来进行整理,有一个整体的认识,一些细节并没有提到,比如HashMap中维护的有一个transient  类型的Node来存放Hash值等。 其他的不足和错误之处也请各位大神多多批评指正。

转载请注明出处: https://www.cnblogs.com/qiaoyutao/p/9618249.html

转载于:https://www.cnblogs.com/qiaoyutao/p/9618249.html

帮助新手理解equals和hashCode相关推荐

  1. 深入理解equals和hashCode关系和区别

    深入理解equals和hashCode关系和区别 直入主题: 区别: 1.他们判断对象相同的方式不一样: 2.他们判断对象是否相等的准确率不一样: 改写equals时总是要改写hashcode 分享一 ...

  2. 运用简单的超市购物车系统,理解重写equals、hashcode的意义

    更多干货见博主个人网站:https://blog.zhenglin.work 运用简单的超市购物车系统,理解重写equals.hashcode的意义,以及map的学习 商品类: 先编写一个商品类,要有 ...

  3. 重写equals方法的hashcode_Java equals 和 hashCode 的这几个问题可以说明白吗?

    前言 上一篇文章 如何妙用Spring 数据绑定机制,灵魂追问 环节留下了一个有关 equals 和 hashcode 问题 .基础面试经常会碰到与之相关的问题,这不是一个复杂的问题,但很多朋友都苦于 ...

  4. Java的equals() 和 hashCode()

    2019独角兽企业重金招聘Python工程师标准>>> 首先,equals()方法和hashCode()方法都来自于Object类的定义,Java类都继承了这两个方法,都定义了自己的 ...

  5. Java实战equals()与hashCode()

    2019独角兽企业重金招聘Python工程师标准>>> 一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equal ...

  6. 关于 equals 和 hashCode,看这一篇真的够了!

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接: https://blog.csdn.net/CringKong/article/de ...

  7. 不同时重写equals和hashCode又会怎样?

    作者:flyhero 微信公众号:码上实战(ID:Push-Code) 可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服 ...

  8. Java基础提升篇:equals()与hashCode()方法详解

    概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承 ...

  9. hashcode 和 equals 的关系_Java equals 和 hashCode 的这几个问题可以说明白吗?

    前言 上一篇文章 如何妙用 Spring 数据绑定? ,灵魂追问 环节留下了一个有关 equals 和 hashcode 问题 .基础面试经常会碰到与之相关的问题,这不是一个复杂的问题,但很多朋友都苦 ...

最新文章

  1. 9个技巧让你的PyTorch模型训练变得飞快!
  2. 【oracle】补充 cursor 基本例子
  3. Object Builder Application Block (2)
  4. supost a second hand marketing place at stanford
  5. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)
  6. C#数据类型转换—使用Convert类转换
  7. CV 里程计、推算定位与视觉里程计 简介
  8. Quick BI功能篇之(一):20分钟入门
  9. 【JavsScript】XMLHttpRequest Level 2 使用指南
  10. 腾讯IM : 如何替换String 表情库
  11. ARM上移植ser2net源码
  12. PDF拆分页面的方法,如何拆分PDF页面
  13. win10系统的应用商店不见了怎么安装回来
  14. 太阳能热水器系统设计
  15. 靠这个方法,我终于月入3万!
  16. cocos2dx画扇形
  17. hdmi怎么支持2k分辨率_简单选择题!花3K买虚荣,还是2K买个踏实
  18. 在计算机中关闭应用程序,电脑中如何取消点击关机后出现的还需要关闭程序的提示...
  19. QtScrcpy使用指南
  20. 从一笔金币充值去思考分布式事务

热门文章

  1. 使用LazZiya.ExpressLocalization开发多语言ASP.NET Core 2.x项目
  2. 需要用sq语句 修改大批量用户的密码_网站文章seo优化及修改已收录文章建议
  3. python没有错误但是不显示结果_python运行不报错又无任何结果输出
  4. 传智播客python2018_Python视频教程下载-2018传智播客Python视频教程下载-西西软件下载...
  5. predict函数 R_RROC三剑客(一)使用R语言手撕ROC曲线
  6. python排序问题_Python简单处理坐标排序问题示例
  7. 动态添加表格点击事件
  8. linux中hadoop环境变量配置文件,Ubuntu中关于hadoop环境变量的设置方法
  9. linux动态可执行文件,Linux中ELF格式 可执行文件+动态链接器 的加载
  10. linux保存编辑信息,linux系统编辑神器 -vim用法大全