【JavaSE】谈谈HashCode的作用

Java的集合有两类

一类是List,还有一类是Set。前者有序重复,后者无序不重复。

当我们在set中插入的时候怎么判断是否已经存在该元素呢?

可以通过equals方法。但是如果元素太多,用这样的方法就会比较慢。
于是有人发明了哈希算法来提高集合中查找元素的效率,这种方式将集合分成若干个存储区域,每个对象都可以计算出一个哈希码,
可以将哈希码分组,分组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。
HashCode方法可以这样理解
它返回的就是根据对象的内存地址换算出的一个值。
这样一来,当集合要添加新元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。
如果这个位置上没有元素,它就可以直接存储在这个位置上,不再进行任何比较了;
如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。
这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

有没有可能两个不相等的对象有相同的hashcode?

有可能.在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值.

如何处理hash冲突?

当hash冲突产生时,一般有以下几种方式来处理

拉链法:
每个哈希表节点都有一个next指针,
多个哈希表节点可以用next指针构成一个单向链表,
被分配到同一个索引上的多个节点可以用这个单向链表进行存储。

开放定址法:
一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。

再哈希:
又叫双哈希法,有多个不同的Hash函数.当发生冲突时,使用第二个,第三个…等哈希函数计算地址,直到无冲突.
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Programmer Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值