Java equals和HashCode方法总结

一、如果是自定义类的equals()方法

如果是自己定义的一个类,比较自定义类用equals和==是一样的,都是比较句柄地址,因为自定义的类是继承于object,而object中的equals就是用==来实现的
源码:

public boolean equals(Object obj) {  
    return (this == obj);  
}  
二、String,Double,Integer,Date,Point等类的equals()方法

但是我们用的String等类型的equals是比较实际内容,是因为String等常用类已经重写了object中的equals方法,这也是为什么我们说字符串比较要用equals

"test".equals(new String("test")) // true
"test" == new String("test") //false
三、什么时候重写equals()方法

一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法,让他们比较内容值而不是地址值。(重写其默认的 A==B 逻辑)

三、什么时候要重写hashCode()方法
在一般的应用中你不需要了解hashCode的用法。
但当你用到hashMap,hashSet等散列集合类时要注意下hashcode()
比如:
你想通过一个object作为key来取hashMap的value,hashMap的工作方法是,通过你传入的key的hashCode值在hashMap找其对应的位置。
但假如你new一个object作为key去拿value的话是永远得不到结果的,因为每次new一个object,这个object的hashCode是永远不同的,所以我们要重写hashCode,你可以令你的hashCode是object中的一个恒量,这样永远可以通过你的object的hashCode来找到正确的地址

四、equals()和hashCode()的关系

当我们重写其中一个方法的时候要重写另一个方法。
并且要使这两个方法满足如下关系:
(1)equal方法比较的结果相等时,它们的hashCode也必须相等
(2)hashCode不等时,他们的equals方法必须也不等
但要注意:hashCode相等时,他们的equals方法不一定要相等

这是因为Hash类的容器是用 hashCode和equals方法一起使用来判断key是否相同的,以下为判断key是否相同的源码

e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))

用hashSet举个例子:
在hashSet中不允许出现重复对象,元素的位置也是不确定的。在hashSet中又是怎样判定元素是否重复的呢?判断两个对象是否相等的规则是:
(1)判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕。如果相等,转入2
(2)判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
所以如果出现hashCode不相等但是equals相等的情况,就会有两个内容一样的对象(equals一样)被当成内容不一样的对象(因为hashCode不一样)存放进了hashSet中的情况发生,这样就违法了hashSet不允许重复内容的原则

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值