对于Java中==、equals()和hashCode()的理解

==和equals()的区别

==:基本数据类型比较的是值,引用数据类型比较的是内存地址;
equals():
1.类没有重写equals()方法时,等价于" == ";
2.类重写了equals()方法时,一般是重写用来比较对象的内容。
比如:经常使用的String类型数据中equals()方法是用来判断字符串值是否相等(String类中的equals()方法是被重写过的,而Object类的equals()是比较对象的内存地址)

hashCode ()

hashCode()的作用是获取对象的哈希码(实际上是一个int整数),这个哈希码的作用就是确定对象在哈希表(散列表,key-value键值对形式)中的索引位置;
1.如果两个对象相等,那么它们的hashCode()值一定要相同;
2.如果两个对象hashCode()相等,它们并不一定相等。
注意:这是在散列表中的情况。在非散列表中一定如此!

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

在HashSet中操作对象,如果对象类中不重写hashCode⽅法,新建对象的hashCode都会不同,HashSet里面会出现重复对象
这点可以体现在HashSet去重原理,当你把对象加⼊ HashSet时,HashSet 会先计算对象的 hashcode 值来判断对象加⼊的位置,同时也会与该位置其他已经加⼊的对象的 hashcode 值作⽐对,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调⽤ equals() ⽅法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加⼊操作成功。如果不同的话,就会重新散列到其他位置。(《Head first java》第⼆版)。这样我们就⼤⼤减少了 equals 的次数,相应就⼤⼤提⾼了执⾏速度。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值