HashCode的利与弊

1.什么是hash?

在这里插入图片描述

  • 一种算法
  • 一个函数

2.什么是hash表?

  • key,value的一种数据结构。
  • 输入key,就可得到value的计算方式称为hash函数
    由于hash函数是一种压缩映射,所以hash表中可能会产生冲突
    (不同的key对应同一个value)

2.什么是hashCode?

在这里插入图片描述

  • hashCode本质上就是一个数
hashCode是怎么来的?

将对象物理地址转换成一个整数,然后该整数通过hash函数的算法就得到了hashcode。
该整数和hashCode是对应的,而对象的物理地址和该整数也是对应的。
所以,对象的物理地址,整数,hashCode是一种映射关系。

3.为什么使用hashCode?

查找效率高!!!

为什么查找效率高???

因为采用散列表,也就是hash表存储对象!!!

为什么使用散列表速度快???

散列表本质是对象的物理地址,也就是内存地址,可以直接定位。(无需进行遍历等操作)。

至于更加底层的,为什么通过内存地址可直接定位就涉及到操作系统的寻址方式了。

hashCode是为了集合而服务的,集合分为List有序可重复集合和Set无序不重复集合。set为了保持集合中对象的互斥性,每添加一个新对象都会调用equals与已经存在于set集合中的每个元素进行比较。当元素量达到一定程度时,效率就会变慢。

使用hashCode寻址时,set集合会根据对象的hashCode值来寻找对应的区间,然后在区间里执行equals方法。(粗定位+细定位


4.hashCode()和equals()

两者的主要用途都是查找对象。

hashCode()方法通过hash值在hash表中定位查找。
equals()通过比较返回true或者false

hashCode()效率高,但不完全可靠(不同对象生成的hashCode可能会相同,而相同对象生成的hashCode可能会不同)
equals()效率低,但完全可靠

如果重写equals(),尽量也重写hashCode()

对象调用equals方法返回true,但两个对象的hashCode是直接通过内存地址计算的,没有进行比较,所以是有可能不同的。

如果对象通过equals()方法返回true,那么hashCode值也应该相同。

为什么??
如果hashCode值不同的话,继承hashCode的hashSet就会将对象存储在两个不同的位置,与set集合的对象互斥性不符。

总结一下

假设1-10存储到集合中,1对应的value是2222,1是对象的物理地址,2222就是hashCode,1和2222的对应关系就是hash函数。存放2222的地方就是hash表。由于压缩映射的关系,假设5对应的value也是2222,那么这种情况就是hash冲突。

hashCode是为了提高查找效率而存在的,但与此同时也存在hash冲突这样的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值