帮助新手理解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触发,讲到它们与哈希表的关系,再到具体的实现,就我目前掌握 ...
随机推荐
- [LeetCode]Two Sum 【Vector全局指针的使用】
无序数组返回两个元素和为给定值的下标. tricks:无序.返回下标增序.返回的是原始数组的下标. vector<int>*pa; bool cmp(int x,int y){ retur ...
- [IT新应用]无线投影技术
会议室内投影时,经常会有笔记本与投影仪之间因兼容性等无法切换的现象. 了解了下,无线投影方案的厂家大致如下: 1.http://www.taco.net.cn/ 2.巴可无线投影 https://ww ...
- asp.net mvc + javascript导入文件内容
.近期做的是对现有项目进行重构.WEB FROM改成MVC,其实也算是推倒重来了. 里面有一个导入功能,将文件上传.原先的做法是有一个隐藏的iframe,在这个iframe的页面中设置一个表单form ...
- C#使用 webBrowser 控件总结
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 测试SQL基础知识
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法.但是 SQL 语言也包含用于更新.插 ...
- Ubuntu TFTP 服务
/******************************************************************** * Ubuntu TFTP 服务 * 说明: * 在Ubun ...
- BZOJ_5369_[Pkusc2018]最大前缀和_状压DP
BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...
- bzoj 4571 美味 —— 主席树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 区间找异或值最大,还带加法,可以用主席树: 可以按位考虑,然后通过加上之前已经有的答案 ...
- 【191】◀▶ Powershell 命令集 Cmdlets
Powershell 命令集 cmdlets cmdlets是Powershell的内部命令,cmdlet的类型名为System.Management.Automation.CmdletInfo,包 ...
- mysql同步延迟导致的问题
前几天又遇到一个mysql读写分离的坑, 在将数据写入master后,因为存在同步延迟,所以如果立马去从库查询刚刚插入的数据可能会出现查询不到数据的情况, 解决办法:强制从主库读取数据,将插入和查询放 ...