Object类的equals方法和hashCode方法

一,equals方法

在Object类中

  1. public boolean equals(Object obj) {     
  2.     return (this == obj);     
  3.     } 
内部也是使用“==”比较引用是否指向同一个对象。所以在不覆盖equals方法时,使用equals方法和==的比较结果是一样的。

什么时候应该覆盖equals方法呢?

当我们希望知道它们在逻辑上是否相等,而不是想知道它们是否指向同一个对象时,我们便需要覆盖equals方法了。

覆盖equals方法的通用约定:

1,自反性  对于任何非null的引用值,x.equals(x) == true

2,对称性 对于任何非null的引用值x,y,x.equals(y) == y.equals(x)

3,传递性  对于任何非null的引用值x,y,z,x.equals(y) ==true,y.equals(z)==true,------>x.equals(z)==true

4,一致性 对于任何非null的引用值x,y,只要equals的比较操作在对象中所用的信息没有被改变,多次调用x.equals(y)返回的值不变。

5,对于任何非null的引用值x,x.equals(null)必须返回false。


实现高质量equals方法的注意点:

1,使用==操作符检查 参数是否为这个对象的引用,是则直接返回true。

2,使用instance操作符检查 参数是否为正确的类型。

3,把参数转换成正确的类型。

4,对于该类中的每个关键域,检查参数中的域是否与该对象对应的域匹配。先比较最有可能不一致的域。

5,覆盖equals方法时总要覆盖hashCode方法。

6,不要将equals声明中的Object对象替换为其他对象


二,hashCode方法

为什么覆盖equals方法时总要覆盖hashCode方法?

因为如果不这么做的话,就违反了Object.hashCode的通用约定,导致该类无法结合所有基于散列的集合(HashMap,HashSet,HashTable)一起正常运作.

通用约定:

1,在应用程序执行期间,只要equals方法的比较操作用到的信息没变,那么对这同一个对象调用多次,hashCode方法都必须始终如一的返回同一个整数.但在应用程序的多次执行中,即重新启动后结果可以不一致.

2,如果两个对象根据equals比较是相等的,那这两个对象调用hashCode方法返回的结果必须是一样的.

3,如果两个对象根据equals比较是不相等,那这两个对象调用hashCode方法返回的结果不一定不同.但不同的对象产生不同的hasCode,可以提高散列表的性能.

不覆盖hashCode而违反的关键约定是第二条:相等的对象必须具有相等的hashCode.

如果相同的对象具有不同的hashCode,那么将对象放入hashMap中,对象会被存到其中一个桶中,但当你去get 时,虽然是同一个对象,但是由于生成的hashCode不同,会到不同的桶中去找,此时便找不到那个对象。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值