我对hashcode的理解

hashcode有什么用

每个java对象都有一个hashcode,并且这个hashcode需要和equal()方法保持一致,使用hashcode是为了让hashmap、hashset等等这些集合提高效率的。
拿hashmap做个例子,每个存入hashmap的key不能重复。
如果hashmap里面已经有100个元素了,那第101个元素要存进去时,就得和前100个元素进行比较,有相同的就不存进去,没有相同的就存进去,效率太低了。
而hashcode可以对应着元素在hashmap中的一个地址(不是指内存地址),如果这个地址还没有存储元素(也就是说第101个元素的hashcode和其他元素都不一样),直接将元素存进去就行了,需要元素的时候根据hashcode从地址中取出即可,效率可太快了,但是为什么能这样子呢。

hashcode是怎么来的

先看一下java源码的一些简单类的hashcode方法
Integer的hashcode,直接返回value值
在这里插入图片描述
Float的hashcode,跟value值也有很大关系
在这里插入图片描述
String的hashcode,也是通过对value的一系列计算得到
在这里插入图片描述

这些类的hashcode都跟自身的value有关,那我们就明白了一点,hashcode是可以用来互相比较的。 再看前面说的例子,既然hashcode与其他元素不一样,value就与其他元素不一样,当然可以直接存储进hashmap中。
这里要求一个前提:两个对象的hashcode不一样,那这两个对象一定是不一样的。
当然,hashcode一样的两个对象,不一定是一样的。
两个不同对象计算出来的hashcode相同,就出现了hash碰撞
所以在hashmap中,第101个元素的hashcode那个位置已经有人时,不代表这个元素重复,还得用equal()方法判断,当然只要hashcode()方法足够优秀,就能大大提高效率。
如果一个元素并不重复但hashcode值的位置已经被占有时,元素要如何存储就看具体实现了,hashmap是开了一个链表来存储这类元素。

重写了equal(),最好重写hashcode()

这里做个提醒,hashcode就是为了减少比较次数,那必然是跟equal方法一致的。如果忘了重写hashcode方法,就可能违反:两个对象的hashcode不一样,那这两个对象一定是不一样的。
会出现一些怪异的现象,比如,hashmap中放进了两个相同的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值