java中 == equals和hashcode总结(面试必问)

细致去分析这三者间的关系可以帮助我们更好地理解java语言特性,理解java虚拟机
前置内容:
jvm的运行时结构
哈希算法

1> 首先,“= =”通常用来比较两个基本数据类型是否相同,比较的是它们的栈地址(在jvm的方法区中)
2>我们去看Object类的源码,其实equals的实现就是用“= =”实现的,但是很多类会重写equals方法,导致了使用上的不同。我们以String举例,String的equals方法对比的就是两个对象的”内容“是否相同,对比的是两个对象的哈希码是否相同,对比是堆(java堆)中的内容
3> hashcode()方法对比的是两个对象的哈希码是否相同,而这个哈希码,是用对象在堆中的内容计算出来的,而不是通过地址计算出来的
总结:如果要比较两个对象是否是同一个对象,那么使用“==”,对比的是对象在jvm方法区中的栈地址,如果要比较两个对象的内容是否相同,则使用equals,也正是因此,我们重写一个类的equals时一定要重写hashcode,目的是让重写后的equals方法认定两个对象有相同的哈希值(不论原本是否如此)
PS:为什么要如此麻烦?
java是内存安全的,无法通过散列码获取内存地址,我们做的判断都是基于jvm暴露给程序员的内容

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值