主要原因是默认从Object继承来的hashCode是基于对象的ID实现的。
如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

资源:http://lelglin.iteye.com/blog/1826152

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。Ojbect类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。

在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样

  • 对于值对象,==比较的是两个对象的值
  • 对于引用对象,比较的是两个对象的地址

默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equals方法。

现在有一个学生对象,有属性学号跟姓名,现在我新建了一个学生对象,又从数据里查出一个学生对象,这两个对象的学号跟姓名都一样,那这两个对象是不是相等呢?一般情况下,除非你有特殊需求要处理,这两个对象是相等的,可如果用==去比较,返回的结果是错误的。

这时候我们就必须重写equlas方法了。如果学号是主键,在equals方法里,我们认为只要学号相同,就可以返回true。

hashCode方法也是可以用来比较两个对象是否相等的。但是我们很少使用,应该说是很少直接使用。hashCode方法返回的是一个int值,可以看做是一个对象的唯一编码,如果两个对象的hashCode值相同,我们应该认为这两个对象是同一个对象。

一般如果使用java中的Map对象进行存储时,他会自动调用hashCode方法来比较两个对象是否相等。

所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。

如上面的学生例子,如果学号相同,不管姓名相不相同,返回的hash值一定要是一样的,这时我们的hash值只与学号有关。

Java代码  
  1. public class Test
  2. {
  3. public static void main(String[] args)
  4. {
  5. HashMap hm = new HashMap();
  6. hm.put(new key(1),new value(2));
  7. if(hm.containsKey(new key(1)))
  8. System.out.println(hm.get(new key(1)));
  9. else
  10. System.out.println("dont have such a key");
  11. }
  12. }

你每次new 一个新对象出来hashcode肯定不一样,所以你拿不到你要的key。

Java代码  
  1. class key
  2. {
  3. int i ;
  4. public key(int i)
  5. {
  6. this.i = i;
  7. }
  8. @Override
  9. public boolean equals(Object obj)
  10. {
  11. if(obj instanceof key)
  12. {
  13. if(((key)obj).i == i)
  14. return true;
  15. }
  16. return false;
  17. }
  18. @Override
  19. public int hashCode()
  20. {
  21. return i;
  22. }
  23. }

1、重写equals方法时需要重写hashCode方法,主要是针对Map、Set等集合类型的使用;

a: Map、Set等集合类型存放的对象必须是唯一的;

b: 集合类判断两个对象是否相等,是先判断equals是否相等,如果equals返回TRUE,还要再判断HashCode返回值是否ture,只有两者都返回ture,才认为该两个对象是相等的。

2、由于Object的hashCode返回的是对象的hash值,所以即使equals返回TRUE,集合也可能判定两个对象不等,所以必须重写hashCode方法,以保证当equals返回TRUE时,hashCode也返回Ture,这样才能使得集合中存放的对象唯一。

转载于:https://www.cnblogs.com/yaobolove/p/5086510.html

为什么要重写hashcode()方法相关推荐

  1. JAVA中重写equals()方法的同时要重写hashcode()方法

    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...

  2. 重写 equals 方法就一定要重写 hashCode 方法?其实有个前提

    作者 l 会点代码的大叔(CodeDaShu) 如果问到 == 和 equals 的区别,相信很多程序员同学都能脱口而出:一个是判断地址,一个是判断内容. 但是如果继续追问:"你重写过 eq ...

  3. hashcode相等的两个对象一定相等吗_为什么重写 equals方法时一定要重写hashCode方法?...

    推荐阅读: 一线架构师总结SpringBoot,Cloud,Nginx与Docker,不信你搞不懂 47天洒热血复习,我终于"挤进"了字节跳动(附面经+学习笔记) 五年时间,从蘑菇 ...

  4. 重写equals方法时必须重写hashcode方法吗

    重写equals方法时必须重写hashcode 有规范: 1,当obj1.equals(obj2) 为 true 时,obj1.hashCode() == obj2.hashCode() 2,当obj ...

  5. why在重写equals时还必须重写hashcode方法

    首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...

  6. java equals重写原则_java中为何重写equals时必须重写hashCode方法详解

    前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 在上一篇博文Ja ...

  7. 学习:重写hashCode()方法的必要性

    当一个类有可能会和其他类发生比较的时候,我们会重写equals方法,但大多数情况下,都忽略了重写hashCode方法. 这里说一下重写hashCode的必要性. 当我们使用HashSet或者HashM ...

  8. java重写面试题_Java面试题:重写了equals方法,为什么还要重写hashCode方法?

    核心问题:重写了equals方法,为什么还要重写hashCode方法? 这不仅仅是一道面试题,而且是关系到我们的代码是否健壮和正确的问题.在前面两篇文章涉及到了equals方法的底层讲解:<说说 ...

  9. Java重写equals方法时为什么要重写hashCode方法

    在我们平时编写Java代码时,重写equals方法时一定要重写hashCode方法,这是为什么呢? 在讨论这个问题前,我们先看下Object类中hashCode方法和equals方法. hashCod ...

最新文章

  1. Eclipse中使用Git
  2. 自律到极致-人生才精致:第9期
  3. Java面向接口编程,低耦合高内聚的设计哲学
  4. [转]浅谈OCR之Tesseract
  5. 非常好用的一些软件和网站
  6. java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present解决方案
  7. hadoop配置2.6.1 centos7
  8. JIURL文档-Linux的虚拟内存与分页机制(x86-64位)(一)
  9. 在.NET中调用存储过程
  10. multimodel_forms 插件用法
  11. System.IO.Directory.Delete 方法的使用
  12. OSGB数据的纹理压缩
  13. java类定义初成员变量赋值_Java中成员变量初始化
  14. MSE = Bias² + Variance?什么是“好的”统计估计器
  15. 每日一佳——Structure Preserving Embedding(Blake Shaw et al. ,ICML,2009)
  16. C++ 获取个位数十位数等
  17. 《Python 黑科技》一键分析评论关键词,制作精美词云
  18. 苹果手机开热点,连上了却无网
  19. 全网首发:OpenJDK如何支持字体的kerning及BUG号
  20. (十一)jmeter接口自动化难点系列---设置响应超时时间

热门文章

  1. python 文字语音朗读-python 利用pyttsx3文字转语音
  2. python入门到精通需要学多久-Python从入门到精通只需要一个月就够了!
  3. python比c语言好学吗-学C语言好还是Python好?
  4. python基础知识资料-Python学习--最完整的基础知识大全
  5. RocketMQ中的主从复制
  6. LeetCode Single Number III(位操作)
  7. LeetCode Rotate Function(寻找规律)
  8. libevent中事件的添加与删除
  9. UUID介绍与生成的方法
  10. Elasticsearch深入11 运维