对HashCode的理解

Hash

什么是hash

hash,翻译散列或哈希,就是把任意长度的输入(也叫预映射),通过哈希算法,得到固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,散列值的空间一般远小于输入空间,正因如此,所以不同的输入可能会得到相同的散列值。所以不能通过散列值唯一确定输入值。简单来书就是一个将任意长度的消息压缩的到固定长度的消息摘要的函数。

特点

相同对象的hash值一定相同,不同对象的hash值可能相同。
将任意长度映射为固定长度,因为映射后的长度比他短,所以可能发生hash冲突。

常见Hash函数

直接取余法

乘数去整法

平方取中法

HashCode

HashCode也是通过hash得到的,代表对像在hash表中的位置,本质还是一个Hash函数,得到的整数值就是散列值。(不同对像的HashCode的算法不同)。
虽然hashCode代表的是在Hash表中的位置,但是这个位置是通过hash函数得到的,而不是查找hash表得到的。
简要来说就是通过算法得到对象在hash表中的位置,该位置通过hashCode来表示。
这也是为什么向HashMap这种为什么不能用基本数据类型,因为没办法得到hashCode。

Object.hashCode()

调用对像的hashCode方法,是一个native方法,此时是将对像所在物理地址位置转换为的整数,在通过hash函数计算,得到一个整数值返回。如果两个对象equals相同,那么hashcode必定相同,这也是为什么当我们定义一个对象时,一般重写equals和hashcode的原因。

equals和hashcode:
如果不重写,那么new出的所有对象都是不相同的(equals不同,equals默认比较的是两个引用对象的地址,所以一定不同,但一般由于我们认为值相等即可,那么就要重写equals方法,又因为hashcode和equals是有关联的,所以也要重写hashcode方法)。
如果两个对象equals相同,那么hashcode一定相同。
如果两个对象hashcode不同,那么equ

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值