Java基础【== 、equals、hashCode() 】

文章讨论了Java中`==`与equals方法的区别,`==`比较基本类型数值或对象引用,而equals默认比较对象内容,可被重写。两个对象hashCode相同但equals不一定,因为可能产生散列冲突。重写equals通常需同时重写hashCode,以确保对象在集合中的正确处理,提高查找效率。
摘要由CSDN通过智能技术生成

1、== 和 equals 的区别?

     ==:如果⽐较的对象是基本数据类型,则⽐较的是数值是否相等;如果⽐较的是引⽤数据类型,则⽐较的是对象的地址值是否相等。

     equals ⽅法:⽤来⽐较两个对象的内容是否相等。注意:equals ⽅法不能⽤于⽐较基本数据类型的变量。如果没 有对 equals ⽅法进⾏重写,则⽐较的是引⽤类型的变量所指向的对象的地址(很多类重新了 equals ⽅法,⽐如 String、Integer 等把它变成了值⽐较,所以⼀般情况下 equals ⽐较的是值是否相等)。

2、两个对象的 hashCode() 相同,则 equals() 也⼀定为 true 吗?

       两个对象的 hashCode() 相同,equals() 不⼀定为 true。因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然⽽哈希值相等,并不⼀定能得出键值对相等【散列冲突】。

3、为什么重写 equals() 就⼀定要重写 hashCode() ⽅法?

       这个问题应该是有个前提,就是你需要⽤到 HashMap、HashSet 等 Java 集合,⽤不到哈希表的话,其实仅仅重写 equals() ⽅法也可以。⽽⼯作中的场景是常常⽤到 Java 集合,所以 Java 官⽅建议重写 equals() 就⼀定要重写 hashCode() ⽅法。 对于对象集合的判断,如果⼀个集合含有 10000 个对象实例,仅仅使⽤ equals() ⽅法的话,那么对于⼀个对象判断就需要⽐较 10000 次,随着集合规模的增⼤,时间开销是很⼤的。但是同时使⽤哈希表的话,就能快速定位到 对象的⼤概存储位置,并且在定位到⼤概存储位置后,后续⽐较过程中,如果两个对象的 hashCode 不相同,也不 再需要调⽤ equals() ⽅法,从⽽⼤⼤减少了 equals() ⽐较次数。 所以从程序实现原理上来讲的话,既需要 equals() ⽅法,也需要 hashCode() ⽅法。那么既然重写了 equals(),那 么也要重写 hashCode() ⽅法,以保证两者之间的配合关系。

hashCode()与equals()的相关规定:

1、如果两个对象相等,则 hashCode ⼀定也是相同的;

2、两个对象相等,对两个对象分别调⽤ equals ⽅法都返回 true;

3、两个对象有相同的 hashCode 值,它们也不⼀定是相等的;

4、因此,equals ⽅法被覆盖过,则 hashCode ⽅法也必须被覆盖;

5、hashCode() 的默认⾏为是对堆上的对象产⽣独特值。如果没有᯿写 hashCode(),则该 class 的两个对象⽆论 如何都不会相等(即使这两个对象指向相同的数据)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值