hashCode介绍

hashCode()的作用是获取哈希码,也被称为是散列码,实际是返回一个int整数,这个哈希码的作用是确定该对象在哈希表中的索引位置hashCode()定义在JDK的Object.java中,Java中的任何类都包含有hashCode()函数。散列表存储的是键值对,他的特点是:能根据键快速的检索出对应的值,这其中就利用了散列码。可以快速的找到所需要的对象。
为什么要有hashCode
HashSet如何检查重复为例来说明为什么要有hashCode:

对象加入HashSet时,HashSet会先计算对象的hashCode值来判断对象加入的位置,看该位置是否有值,如果没有,HashSet会假设对象没有重复出现;如果发现有值,这时会调用equals()方法来检查两个对象是否真的相同,如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置,这样就大大减少了equals的次数,相应就大大提高了执行速度。

  • 如果两个对象相等,则hashcode一定也是相同的
  • 两个对象相等,对两个对象分别调用equals方法都返回true
  • 两个对象有相同的hashcode值,他们不一定是相等的
  • equals方法被覆盖过,则hashcode方法也必须被覆盖
  • hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode()方法,则该class的两个对象无论如何都不会相等(即使两个对象指向相同的数据)
    为什么重写了equals()方法还需要重写hashCode()方法?
    equals()只判断对象属性是否相同,hashCode()要判断两者的地址是否相同。java中如果要判断两个对象是否相等,需要同时满足地址+属性都相同才可以。
  • 只重写equals()方法,不重写hashCode()方法:
public class Student {private String name;private int age;public Student(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}// 省略 get,set方法...
}

如果只重写了equals()方法,而不重写hashCode()方法,可能就会出现两个没有关系的对象equals相同(因为他是根据对象的特征进行重写的),但是hashCode不相同的情况。因为此时 Student 类的 hashcode() 方法就是 Object 默认的 hashcode()方 法,由于默认的 hashcode()方法是根据对象的内存地址经哈希算法得来的,所以 stu1 != stu2,故两者的 hashcode 值不一定相等。
根据 hashcode 的规则,两个对象相等其 hash 值一定要相等,矛盾就这样产生了。上面我们已经解释了为什么要使用 hashcode 算法,所以即使字面量相等,但是产生两个不同的 hashCode 值显然不是我们想要的结果。

  • 重写 equals() 时,也重写了 hashCode() 方法:
public class Student {private String name;private int age;public Student(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}// 省略 get,set方法...
}

从 Student 类重写后的 hashcode() 方法中可以看出,重写后返回的新的 hash 值与 Student 的两个属性是有关,这样就确保了对象和对象地址之间的关联性。

面试题--hashCode与equals相关推荐

  1. hashcode的作用_看似简单的hashCode和equals面试题,竟然有这么多坑!

    hashCode()方法和equals()区别与联系这到面试题,看似简单,根据以往面试星友的情况来说,绝大部分人都不能很好的回答出来,要么没有逻辑,想到一句就说一句,要么抓不住重点,答非所问.从这个很 ...

  2. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

  3. 看似简单的hashCode和equals面试题,竟然有这么多坑!

    作者:徐刘根,大家都喊我根哥! hashCode()方法和equals()区别与联系这到面试题,看似简单,根据以往面试星友的情况来说,绝大部分人都不能很好的回答出来,要么没有逻辑,想到一句就说一句,要 ...

  4. 面试题:重写equals方法为什么通常会重写hashcode方法?

    最近在面试的时候,当问完了HashMap的数据结构之后,通常会再多问一个问题,就是:重写equals方法时通常为什么也要重写一下hashcode方法? 其实这个问题,本质上又回到HashMap的应用场 ...

  5. equals的效率_看似简单的hashCode和equals面试题,竟然有这么多坑!

    点击上方"Java后端技术",选择"置顶或者星标" 你关注的就是我关心的! hashCode()方法和equals()区别与联系这到面试题,看似简单,根据以往面 ...

  6. 【面试题】hashCode() 和 equals() 之间的关系

    前言 关于 hashCode 和 equals 的处理,遵循如下规则: 只要重写 equals,就必须重写 hashCode 因为 Set 存储的是不重复的对象,依据 hashCode 和 equal ...

  7. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写 hashcode 和 equals 方法?...

    1. 通过Hash算法来了解HashMap对象的高效性 2. 为什么要重写equals和hashCode方法 3. 对面试问题的说明 <Java 2019 超神之路> <Dubbo ...

  8. hashCode()、equals()以及compareTo()方法的理解

    原文出自:http://blog.sina.com.cn/s/blog_50d936c40100nvzz.html hashCode().equals()以及compareTo()方法的理解 转载▼ ...

  9. hashcode的作用_【09期】说说hashCode() 和 equals() 之间的关系?

    上一篇关于介绍Object类下的几种方法时面试题时,提到equals()和hashCode()方法可能引出关于"hashCode() 和 equals() 之间的关系?"的面试题, ...

最新文章

  1. 简单谈谈Docker镜像的使用方法_docker
  2. android底层按键监听,Android应用中Back键的监听及处理实例
  3. python工资高还是java-未来Java、大数据、Python哪个前景更好,薪资更高?
  4. [转载] 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解
  5. 用计算机装扮校园图片,第4课装扮我们的校园——在场景中运用图形元件教学设计.doc...
  6. Hadoop-2.0命令手册
  7. Spring IOC源码笔记(一)
  8. R语言快速入门课——结合各种生物信息学及医学案例,使R语言快速入门——R软件及Rstudio下载(同步课程正在更新中)
  9. 从VC6到VC9移植代码问题总结
  10. 推荐8个不错的视频自动加字幕工具
  11. 笔记本电脑耳机左右声道音量不一样,如何解决?
  12. 文件指针移动(完整版)
  13. 沧海的孤塔-chimera
  14. 教师节快乐,全网最全编程学习网站汇总来了,还不赶快收藏
  15. 2022年通信工程专业保研:从四非到浙大工院夏令营面试经验分享(前期准备篇/含通信原理面试真题)
  16. linux p4 命令行,linux下的p4用法
  17. 海康硬盘录像机接入RTSP/onvif协议安防视频平台EasyNVR的注意事项
  18. [原创]自定义ViewPager实现3D画廊效果
  19. Angular4 失焦与点击冲突处理
  20. PHP产生随机不重复激活码

热门文章

  1. 2021-2-22 爬取中文出现乱码
  2. 为 PyPy 安装 pip
  3. tftp恢复WHR-HP-G54
  4. Spring LTW 战斗结果记录
  5. 滤波算法——均值滤波,中值滤波,一阶(αβ)滤波,卡尔曼滤波
  6. python中a* b是什么意思_Python中a-=b与a=a-b的区别是什么?
  7. lintcode digit counts
  8. RDMA编程1 建立侦听
  9. 音频格式转换的软件有哪些?这些软件值得收藏
  10. 怎样才能把SEM百度竞价推广做好?