java基础:2、==、equals()和hashcode()之间的区别?

2、==、equals()和hashcode()之间的区别?

1、==与equals()的区别?

(1)==比较的是两个对象的地址是不是相同,也就是比较是不是同一个对象。
( 其中,基本数据类型= =比较的是值,引用数据类型比较的是内存地址。)

(2)equals比较的是两个对象是否相等,只能用于引用类型。分为两种情况:
情况一:没有重写equals方法。此时equals和= = 的作用相同,都是比较的对象的内存地址。
情况二:重写了equals方法。一般我们可以通过重写equals方法比较两个对象的内容是否相等。例如String类和Date类都重写了equals方法。

2、什么是hashcode()?如何应用?

hashcode()方法是根据对象的存储地址返回的int类型的哈希码,目的就是为了生成哈希码,在散列结构中确定对象的存储位置。主要应用于哈希表中,如HashMap、HashTable、HashSet。
应用:
比如在 HashMap中要求key值不可重复。那么怎样保证key值不重复呢?当然可以使用equals方法,但是如果集合中的元素非常多,数量很大的时候需要调用很多次equals方法,会大大降低效率。
所以,在添加新的key值时,先调用hashcode()方法,将key值定位到它应该放的物理位置上。如果该物理位置上没有值,就直接存储在这个物理位置;如果该物理位置已经存在值,再调用equals方法比较,相同的话就不存,不相同的话就散列在其他地址。
这样,调用equals方法的次数大大降低,明显提高了效率。

3、hashcode()和equals的关系?

(1)如果两个对象equals为true,那么hashcode()一定相同;
(2)如果两个对象equals为false,那么hashcode()可能不同,也可能相同;
(3)如果两个对象hashcode()相同,那么equals可能为true,也可能为false;
(4)如果两个对象hashcode()不同,那么equals一定为false。

一般来说,关于这两个方法有两个规范:
(1)若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。也就是说:应该保证两个对象相等,他们的哈希码也相等。
(2)如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象的哈希码一定不相同。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。

4、为什么重写equals方法时要重写hashcode()方法?

如果不这样做的话,就会违反Object.hashCode的通用约定。
比如说,重写了equals方法后,没有重写hashcode()方法会出现equals相等的对象却有不同的hashcode()的情况,重写hashcode()就是为了避免这种情况的出现。
不然会导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值