Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

kingsundi 2019-03-31

前提

  • java version 1.8【注意版本】
  • hashCode()的作用是什么?
  • 散列码是用来干什么?
  • 为什么有hashCode必须要equals?
  • 为什么散列表需要散列码呢?

我这里没有深入到底层,底层请大家去爬源码吧

吐槽

面试官:Java中的hashCode和equals关系说下

程序员:这个(已经慌了,背的理论早忘记了)

面试官:好的,你可以回去等消息了

hashCode()方法

  • 返回对象的哈希代码值(就是散列码),用来支持哈希表,例如:HashMap
  • 可以提高哈希表的性能
  • 先看下Object源码的hashCode方法

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

源码注释特别长,我大概总结下,像Hash开头的类,HashMap、HashSet、Hash等等

哈希代码值可以提高性能

实现了hashCode一定要实现equals,因为底层HashMap就是通过这2个方法判断重复对象的

绕口令式hashCode与equals

  1. 如果两对象equals()是true,那么它们的hashCode()值一定相等
  2. 如果两对象的hashCode()值相等,它们的equals不一定相等

代码案例

理论我反正看的头疼,还是上代码来理解下吧

老规矩idea生动生成

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

注释很详情

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

main运行

注释很清楚了,HashSet去重是怎么判断的

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

运行结果

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

如果缺少hashCode或equals方法

输出结果(不会去重)

set:[wang - 100, wang - 100, WANG - 100, java - 200]

Hash性能分析

HashSet是不允许有重复元素的

场景:HashSet存入10万数据,当add第10万零1个元素的时候,

底层源码可不是一个个遍历去判断重复元素,

是通过hash值去判断的

源码

HashSet

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

已经到HashMap了

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

通过对象的hashCode()方法计算出哈希值

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

  • 核心代码,见注释

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

源码非常复杂,我也是利用idea工具,把变量值放到

下面New Watch里面,整个数据情况就出来了

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

  • 1:先tab数组下标判断是否null
  • 2:然后hash值 、equals值等比较

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

总结

  1. hashCode() 在散列表中才有用,在其它情况下没用
  2. 哈希值冲突了场景,hashCode相等,但equals不等

写在最后:柠檬为大家准备了一些适合于1-5年以上开发经验的java程序员面试涉及到的绝大部分面试题及答案做成了文档和学习笔记文件以及架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望可以帮助到大家。

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

Java中的hashcode是干嘛的,三两年的程序员真不一定知道!

获取方式:请大家关注并私信小编关键词:“资料”即可获取你需要的各类资料。

相关推荐