打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Object类中的equals和hashCode方法

无论何时这个equals方法被重写那么都是有必要去重写hashCode方法,这个是因为为了维持hashCode的一种约定,相同的对象必须要有相同的hashCode值。

--------------------------------------------------------------------------------------------

equals方法的结果为false,那么hashCode方法返回的结果可以相同也可以不相同

---------------------------------------------------------------------------------------------

hashcode是Object中的函数,所有类都拥有的一个函数,主要返回每个对象的hash值,主要用于哈希表中,如HashMap、HashTable、HashSet。

哈希码的通用约定如下:

  • 在java程序执行过程中,在一个对象没有被改变的前提下,无论这个对象被调用多少次,hashCode方法都会返回相同的整数值。对象的哈希码没有必要在不同的程序中保持相同的值。

  • 如果2个对象使用equals方法进行比较并且相同的话,那么这2个对象的hashCode方法的值也必须相等。

  • 如果根据equals方法,得到两个对象不相等,那么这2个对象的hashCode值不需要必须不相同。但是,不相等的对象的hashCode值不同的话可以提高哈希表的性能。

  • 由下图可以看到,hashCode是一个native方法,看不到实现,注解中说hashCode返回的是由对象存储地址转化得到的值,是否如此,可以看源码一探究竟。

  • 先给结论:

  • java6、7默认是返回随机数

  • java8默认是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia’s xorshift scheme随机数算法得到的一个随机数

  • 源码探索过程可以参考:
    https://fangjian0423.github.io/2016/03/12/java-Object-method/

  • 参考

  • https://juejin.im/entry/5968876df265da6c232898c2
    https://fangjian0423.github.io/2016/03/12/java-Object-method/

  • ---------------------------------------------------------------------------------------------------------------------------------------------

  • Java Object.hashCode()返回的是对象内存地址?

  • 基于OpenJDK 8

    一直以为Java Object.hashCode()的结果就是通过对象的内存地址做相关运算得到的,但是无意在网上看到有相应的意见争论,故抽时间从源码层面验证了剖析了hashCode的默认计算方法。

    先说结论:OpenJDK8 默认hashCode的计算方法是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia's xorshift scheme随机数算法得到的一个随机数。和对象内存地址无关。

  • ---------------------------------------------------------------------------------------------------------------------------------------------

当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。

对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java中Object的默认hashCode方法实现原理
Hashcode的作用
新手必备Java快速扫盲指南
Java Object类
Java源码解析
用来理解 Java 编程语言的 8 个图表
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服