18K程序员Java中的hashcode是干嘛的,居然都不知道!
前提
- java version 1.8【注意版本】
- hashCode()的作用是什么?
- 散列码是用来干什么?
- 为什么有hashCode必须要equals?
- 为什么散列表需要散列码呢?
我这里没有深入到底层,底层请大家去爬源码吧
吐槽
面试官:Java中的hashCode和equals关系说下
程序员:这个(已经慌了,背的理论早忘记了)
面试官:好的,你可以回去等消息了
hashCode()方法
- 返回对象的哈希代码值(就是散列码),用来支持哈希表,例如:HashMap
- 可以提高哈希表的性能
- 先看下Object源码的hashCode方法
源码注释特别长,我大概总结下,像Hash开头的类,HashMap、HashSet、Hash等等
哈希代码值可以提高性能
实现了hashCode一定要实现equals,因为底层HashMap就是通过这2个方法判断重复对象的
绕口令式hashCode与equals
- 如果两对象equals()是true,那么它们的hashCode()值一定相等
- 如果两对象的hashCode()值相等,它们的equals不一定相等
代码案例
理论我反正看的头疼,还是上代码来理解下吧
老规矩idea生动生成
注释很详情
main运行
注释很清楚了,HashSet去重是怎么判断的
运行结果
如果缺少hashCode或equals方法
输出结果(不会去重)
set:[wang - 100, wang - 100, WANG - 100, java - 200]
Hash性能分析
HashSet是不允许有重复元素的
场景:HashSet存入10万数据,当add第10万零1个元素的时候,
底层源码可不是一个个遍历去判断重复元素,
是通过hash值去判断的
源码
HashSet
已经到HashMap了
通过对象的hashCode()方法计算出哈希值
- 核心代码,见注释
源码非常复杂,我也是利用idea工具,把变量值放到
下面New Watch里面,整个数据情况就出来了
- 1:先tab数组下标判断是否null
- 2:然后hash值 、equals值等比较
总结
- hashCode() 在散列表中才有用,在其它情况下没用
- 哈希值冲突了场景,hashCode相等,但equals不等
如何学习呢?有没有免费资料?
免费送你2019年最新java自学入门视频教程!
今天免费分享 免费分享!
转发 !
转发 !
转发 !关注我 私信回复关键词:“ 学习 ” 即可免费领取!
相关推荐
雷潇 2020-08-16
happylife 2020-05-31
Bloddy 2020-04-23
范范 2020-03-27
faiculty 2020-02-14
mbcsdn 2020-01-07
hanyujianke 2020-01-01
Happyunlimited 2019-12-11
fenghuoliuxing0 2016-08-25
zhuyonge 2016-01-02
85251742 2014-08-30
极乐净土 2013-07-14
newtrekWang 2019-07-01
WindChaser 2019-06-30
落地窗前梦残夜 2019-06-28
caipeng 2019-06-27
WindChaser 2019-06-28
潇汀 2011-09-14