HashSet判断唯一性的步骤

本文探讨了HashSet判断唯一性的三个步骤:HashCode()、==和equals()。通过测试代码展示了即使重写方法,HashSet仍然使用==进行对象比较,强调了HashSet的唯一性依赖于程序员对HashCode和equals的实现以及对象地址的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HashSet 判断唯一性的不是两个步骤而是三个步骤

1.HashCode()

2.==

3.equals()

前面的比较会短路后面的比较 ; 也就是说 1 &&( 2||3)

底层是由Map存储数据的 , 用key 存储 



下面来看一下 判断唯一性的步骤:


为了看到测试效果就没有按照规则来重写hashcode 和 equals 方法

下面的person类是用于测试的类




下面是测试代码




结果如下



就跟预想的一样,根据hashcode 和 equals 方法 来判断唯一性,但是下面来看到底有没有  == 来判断唯一性

我把 hashcode 返回固定值 1; 把equals方法永远返回 false ,如果只是根据 hashcode 和 equals 来判断唯一性的话,那么person 对象都可以装进来,可是事实却是!!






结果如下:hashset 中 依然只有一个对象,说明不只是根据 hashcode 和equals 方法来判断唯一性的,其中还经历了 用 == 来判断



总结: HashSet所谓的唯一 ,不是真正的唯一,而是取决于程序员如何定义HashCode和equals方法,当然其中还会经历 ==(对象比较是比较的地址) 的判断




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值