hashcode讲解【最详细版本】

Object 基类

Object 含有的方法
object

hashCode

作用:用于查找的快捷性,常用于确定对象的存储地址
HashtableHashMap
默认情况下,Object中的hashCode() 返回对象的32jvm内存地址。

如果两个对象相同, equals方法一定返回true,并且这两个对象的HashCode一定相同
两个对象的HashCode相同,并不一定表示两个对象就相同,即equals()不一定为true,只能说明这两个对象在一个散列存储结构中,所以当产生哈希冲突时,还得通过 equals() 方法进一步判断两个对象是否相同

哈希算法也称为散列算法,是将数据依靠 hash函数直接指定到一个地址上。当集合要添加新的元素时,先调用这个元素的hashCode方法,能定位到它应该放置的物理位置上。

该位置没有元素,直接存储,不进行比较
该位置有元素,直接调用 equals函数与新元素比较,相等的话,就不存储了。不相同的话就是发生了 Hash
key相同导致冲突的情况,那么就在这个 Hash key的地方产生一个链表,将所有产生相同HashCode的对象放
到这个单链表上去,串在一起。这样实际调用equals方法的次数就大大降低了,几乎只需要一两次。

JVM每new一个Object,它都会将这个Object丢到一个Hash表中去,这样的话,读取过程,它会根据对象的HashCode再从Hash表中取这个对象。若HashCode相同再去调用equal。
这样做的目的是提高取对象的效率

重写 hashcodeequals方法可以迅速的在hashmap中找到 key的位置;
1、重写hashcode是为了保证相同的对象会有相同的hashcode
2、重写equals是为了保证在发生冲突的情况下取得到Entry对象(就是 key或是元素);

HashCode()和equals()的区别

hashcode()用于获取hash码,equals()用于比较两个对象是否相等。
遵循以下的规定:

  • 如果两个对象相等,hashCode一定相等
  • 如果两个对象的hashCode相等,他们未必相等

hashSet为例,HashSet首先会调用对象的hashCode()获取到哈希码,并且通过哈希码确定该对象在集合中的位置。假设这个位置已经保存了一个对象,则HashSet就会调用equals()对两个对象进行比较,如相等则说明两个对象重复,不会保存新的对象,直接舍弃即可。如若不相等,就说明这两个对象存储的位置发生了碰撞,此时HashSet就会采用链式结构在同一位置保存多个对象,将新对象加入到链表的尾部。之后,再有新添加的对象也映射到这个位置的时候,就需要和这个链表中的所有的对象进行equals()比较,如不相等,继续添加到链表之后。

参考
hashcode

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值