11.==与equals的区别,hashCode与equals之间的关系

一、==与equals的区别

1.==

  ==对于基本数据类型来说,比较的是值。对于引用数据类型来说,比较的是对象内存地址。

2.equals()方法

  如果一个类没有重写equals方法,那么比较两个对象时,默认比较的是对象的内存地址,即等价于通过==来比较。

  如果一个类重写了equals方法,那么就有自定义的来比较是否相等的标准。


二、hashCode与equals之间的关系

1.hashCode()方法

  hashCode方法的作用是获取哈希码,也称为散列码。定义在Object类中,默认是将对象的内存地址转换为整数之后返回。

  哈希码主要在哈希表这类集合映射的时候用到。(例如HashMap将Key映射到对应的Value上,用的就是哈希取余法,拿哈希码与存储元素数组的长度取余,获取Key对应的Value所在下标位置。)

2.为什么重写equals方法时必须重写hashCode方法?

  上面说到,equals方法默认比较的是对象内存地址,重写后,才有自定义的比较规则。而在hashMap的源码中,是先通过hashCode方法获取对象的哈希值,比较两个对象的hash值是否相等,再通过equals方法来进行比较。所以在equals方法未被重写时,通过hashCode方法获取哈希值来比较和通过equals方法来比较,本质上比较的都是对象的内存地址。一旦重写了equals方法,即不再用对象内存地址比较,有自定义的比较规则,那么为了保持这两个方法比较对象是否相等结果的一致性,所以也必须重写hashCode方法,让它不再通过对象的内存地址来获取哈希值,而是自定义其获取哈希值的方式,来实现两个对象使用equals方法比较为true 那么通过hashCode方法获取它们的hash值也必须相等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值