博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA中重写equals()方法为什么要重写hashcode()方法说明
阅读量:7121 次
发布时间:2019-06-28

本文共 1173 字,大约阅读时间需要 3 分钟。

  重写hashCode()时最重要的原因就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值。如果在将一个对象用put()方法添加进HashMap时产生一个hashCode()值,而用get()取出时却产生了另外一个 hashCode()值,那么就无法重新取得该对象了。所以,如果你的hashCode()方法依赖于对象中易变的数据,那用户就要小心了,因为此数据发生变化时,hashCode()就会产生一个不同的hash码,相当于产生了一个不同的“键”。 

      Object的hashCode()方法,返回的是当前对象的内存地址。下次如果我们需要取一个一样的“键”对应的键值对的时候,我们就无法得到一样的hashCode值了。因为我们后来创建的“键”对象已经不是存入HashMap中的那个内存地址的对象了。 

1、 为什么要重载equal方法?

答案:因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。 

2、 为什么重载hashCode方法?

答案:一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会 重载hashCode,那么为什么要重载hashCode呢?就HashMap来说,好比HashMap就是一个大内存块,里面有很多小内存块,小内存块 里面是一系列的对象,可以利用hashCode来查找小内存块hashCode%size(小内存块数量),所以当equal相等时,hashCode必 须相等,而且如果是object对象,必须重载hashCode和equal方法。

3、 为什么equals()相等,hashCode就一定要相等,而hashCode相等,却不要求equals相等?

答案:1、因为是按照hashCode来访问小内存块,所以hashCode必须相等。

          2、HashMap获取一个对象是比较key的hashCode相等和equal为true。

之所以hashCode相等,却可以equal不等,就比如ObjectA和ObjectB他们都有属性name,那么hashCode都以name计算,所以hashCode一样,但是两个对象属于不同类型,所以equal为false。

4、 为什么需要hashCode?

答案:1、 通过hashCode可以很快的查到小内存块。

         2、 通过hashCode比较比equal方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。

转载于:https://www.cnblogs.com/zhangchuan210/p/3535532.html

你可能感兴趣的文章
求大神指导思路!!!!!!!!!!!没人会吗??????
查看>>
EtherCAT 同步模式
查看>>
怎样才能成为资深架构师?
查看>>
openStack 云平台管理节点管理网口流量非常大 出现丢包严重 终端总是时常中断问题调试及当前测试较有效方案...
查看>>
Zabbix结合Grafana 监控
查看>>
Linux目录结构及相关命名规定
查看>>
puppet aix之自动化用户管理
查看>>
我的友情链接
查看>>
thinkphp-条件判断-if标签
查看>>
SQL Server 2008 R2 事务与隔离级别实例讲解
查看>>
Swift之控件-UIlabel
查看>>
Windows Phone 8 后台代理(P1:周期性任务)
查看>>
PHP 5.3.13 memcache win 64 配置和安装
查看>>
Highcharts-功能强大的图表库的应用
查看>>
mysql oracle python连接
查看>>
根据wsdl远程调用接口
查看>>
《zabbix进程组成结构与zabbix_agentd.conf配置文件参数详解》-3
查看>>
Postfix邮件服务器的原理和postfix + dovecot配置,使用Thunderbird发送邮件和SMTP认证...
查看>>
CA数字证书服务的配置、搭建安全的WEB服务器、安全的邮件服务器
查看>>
Map集合的第二种迭代--学习笔记
查看>>