Java中的HashCode

Hash是一种将任意长度的数据转换为固定长度输出的函数。它的特征包括一致性与equals的关系。哈希表利用Hash函数实现快速查找,插入和删除操作。hashCode在数据存储,如HashMap和HashSet中用于定位对象。当自定义对象存储在这些数据结构中时,需要重写hashcode方法以确保正确索引。默认情况下,hashCode是基于对象的内存地址计算的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Hash是什么?

hash是一个函数,该函数中的实现是一种算法,就是通过一系列的算法来得到一个hash值,这个时候,我们需要另一个东西--hash表(通过hash算法得到hash值就在这张hash表中)

2.Hash值的特征

1.一致性(consistent):在程序的一次执行过程中,对同一个对象必须一致地返还同一个整数。

2.equals结果相等,则hashcode相同(反之不一定,equals不相等,hashcode也有小概率相同)。

3.hash相同,equals不一定相同。

3.为什么hash值要组成hash表?

哈希表是一种数据结构,它可以提供快速的插入和查找操作。不管哈希表有多少数据,插入和删除时间都是接近常量的时间。即:O(n)

4.HashCode的作用

hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有

例如内存中有这样的位置

0 1 2 3 4 5 6 7

而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。

但如果用hashcode那就会使效率提高很多。

我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除 8求余数直接找到存放的位置了

5.什么时候应该重写/覆盖hashcode方法?

1.只有在使用HashMap、HashSet等数据结构时,并且存储的对象是我们自定义的对象时,才需要重写。

2.当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入;如果有,就调用equals方法与新元素进行比较,相同不存,不同就存入。

6.hashcode方法默认根据什么创建的

自己创建对象hashCode是根据对象的地址计算得出的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值