帮助新手理解equals和hashCode
入行快要两年,偶尔想起来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
帮助新手理解equals和hashCode的更多相关文章
- JAVA中用堆和栈的概念来理解equals() "=="和hashcode()
在学习java基本数据类型和复杂数据类型的时候,特别是equals()"=="和hashcode()部分时,不是很懂,也停留了很长时间,最后终于有点眉目了. 要理解equals() ...
- 深入理解equals和hashCode关系和区别
为什么要说equals和hashCode这两个东西,一来是因为有不少小伙伴面试时被问过这个东西,二来则是因为如果了解了这两个东西的原理,那么实际的开发过程中,对效率和容错率上还是能帮上很大的忙! 直入 ...
- Object方法equals、hashCode
java知识背景: 1)hashCode()方法返回的是Jvm的32位地址 2)==比较的是对象在jvm中的地址 3)Object的equals()比较的就是jvm物理地址 4)比较2个对象使用equ ...
- Java中的equals和hashCode方法
本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...
- Java提高篇——equals()与hashCode()方法详解
java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- Java实战equals()与hashCode()
一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); ...
- 一次性搞清楚equals和hashCode
前言 在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范. Object类是Java中的万类之祖,其中,equals和hashCode是2个非常 ...
- 关于equals和hashCode
equals()和hashCode()是Object类的两个函数,重要性可见一斑,不过我们平时使用却未必能深入理解他们.本文从java doc触发,讲到它们与哈希表的关系,再到具体的实现,就我目前掌握 ...
随机推荐
- Jenkins系列之-—02 email-ext 邮件模板
邮件通知配置 系统管理 → 系统设置 → 邮件通知 SMTP 服务器:配置 SMTP 服务器.(不填默认本地运行服务器) 用户默认邮件后缀:注册用户邮件只需填写用户名即可,后缀会加该后缀,如果填写,则 ...
- Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException
使用MapReduce编写的中文分词程序出现了 Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeExcept ...
- ARGB,RGB颜色值表示
转载请注明出处:http://blog.csdn.net/wei_chong_chong/article/details/50831493 今天自己定义一个控件.设置背景颜色时犯难了 如今就来总结一下 ...
- ASP.NET MVC 原理
我出了份卷子做面试题,其中之一就是要求说说ASP.NET MVC的原理.感觉太空泛了,谁能说得准呢? 但是,如果站在我这个面试官立场,面试题好多时并不要求有标准答案,可能也没有什么标准答案,主要是通过 ...
- ora-12541无监听的一种场景
项目上突然出现无法连接Oracle数据库的情况,提示无监听程序. 现象: 查看 listener.ora配置无问题,用Net Configuration Assistant重建监听,NCA也处于假死状 ...
- IDEA debug调式快捷键
F9 resume programe 恢复程序 Alt+F10 show execution point 显示执行断点 F8 Step Over 相当于eclipse的f6 跳到下一步 F7 Step ...
- diy数据库(二)--网络通信类
一.首先,我们先实现OSS层的ossSocket类.供数据库client和数据库引擎进行通信 友情提示:相应上面的类图的头文件和源码附在了本文的最以下. int _fd ;//socket的文件描写叙 ...
- RK平台LCD调试说明【转】
本文转载自:http://blog.csdn.net/u014770862/article/details/76274951?locationNum=2&fps=1 RK平台LCD调试说明 原 ...
- C++ 多线程与并发
1. 非原子操作 这些非原子操作在被编译为汇编代码后不止一条指令. 自加.自减少: new 关键字: 申请内存: 调用构造函数: pInst = new T; // 对于这样一个赋值语句,更是包含了如 ...
- SimpliciTI 地址分配
1.多个ED节点和AP正确连接后,AP都会给ED分配一个相应的地址.当某个ED出现意外,比如电源问题,和AP断开连接,AP并不将该ED节点的地址消除.当该ED恢复正常,重新申请加入网络时,AP会检测该 ...