入行快要两年,偶尔想起来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的更多相关文章

  1. JAVA中用堆和栈的概念来理解equals() "=="和hashcode()

    在学习java基本数据类型和复杂数据类型的时候,特别是equals()"=="和hashcode()部分时,不是很懂,也停留了很长时间,最后终于有点眉目了. 要理解equals() ...

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

    为什么要说equals和hashCode这两个东西,一来是因为有不少小伙伴面试时被问过这个东西,二来则是因为如果了解了这两个东西的原理,那么实际的开发过程中,对效率和容错率上还是能帮上很大的忙! 直入 ...

  3. Object方法equals、hashCode

    java知识背景: 1)hashCode()方法返回的是Jvm的32位地址 2)==比较的是对象在jvm中的地址 3)Object的equals()比较的就是jvm物理地址 4)比较2个对象使用equ ...

  4. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  5. Java提高篇——equals()与hashCode()方法详解

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

  6. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)

    Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例  原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...

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

    一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); ...

  8. 一次性搞清楚equals和hashCode

    前言 在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范. Object类是Java中的万类之祖,其中,equals和hashCode是2个非常 ...

  9. 关于equals和hashCode

    equals()和hashCode()是Object类的两个函数,重要性可见一斑,不过我们平时使用却未必能深入理解他们.本文从java doc触发,讲到它们与哈希表的关系,再到具体的实现,就我目前掌握 ...

随机推荐

  1. PHP 按位与或 (^ 、&)

    今天朋友群里朋友问了下 按位与或的问题.. 按位于主要是对二进制数操作. <?php $a = 1; $b = 2; $c = $a^b; ?> 这里不是单纯的相加关系 十进制 1换算成二 ...

  2. 【转载】TCP和TCP/IP的区别

    TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议, 又叫网络通讯协议,这个协议是Internet国际互联网络的基 ...

  3. LuaInterface简单介绍

    LuaInterface简单介绍 Lua是一种非常好的扩展性语言.Lua解释器被设计成一个非常easy嵌入到宿主程序的库.LuaInterface则用于实现Lua和CLR的混合编程. (一)Lua f ...

  4. centos 安装mysql时错误unknown variable &#39;defaults-file=/opt/redmine-2.6.0-2/mysql/my.cnf&#39;

    找到my.cnf所在目录.运行 chmod 664 my.cnf,再启动mysql成功

  5. leetcode_Repeated DNA Sequences

    描写叙述: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: &qu ...

  6. C语言 字符串操作 笔记

    /* C语言字符串的操作笔记 使用代码和注释结合方式记录 */ # include <stdio.h> # include <string.h> int main(void) ...

  7. c/c++内存使用原则

    1 no malloc no free 2 no new no delete 如果对象不是new出来的,那么这个对象在生命周期结束后会自动调用析构函数自己释放自己的内存,不需要delete. 但是如果 ...

  8. Linux设备驱动--块设备(三)之程序设计

    块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数是 register_blkdev(),其原型为:int register_blkdev(unsigned i ...

  9. RabbitMQ简述

    官网教程 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现.支持多种客户端,如:Python.Ruby..NET.Java.J ...

  10. 前端之html第一天

    一.内容