对HashCode的理解

本文介绍了哈希(Hash)的概念、特点和常见Hash函数,包括直接取余法、乘数去整法和平方取中法。接着详细讨论了Java中的HashCode,包括Object.hashCode()、Objects.hashCode()、Arrays.hashCode()、String.hashCode()和Integer.hashCode()的实现。文章强调了hashCode的作用在于提高对象在哈希表中定位的效率,并解释了为什么通常在重写equals时也需要重写hashCode。此外,文章还探讨了为什么选择31作为乘数,主要考虑的是性能和冲突概率的平衡。
摘要由CSDN通过智能技术生成

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不同,那么equals一定不同。

Objects.hashCode(),Arrays.hashCode()

 public static int hash(Object... values) {
   
        return Arrays.hashCode(values);
    }

//这个是Array.hashCode()    
public static 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值