在Set接口的实现类中的HashSet是怎么保证数据的唯一性的?t

HashSet保证元素唯一性的原理

HashSet存储自定义类型的元素
实验过程:
1.Hashset存储自定义类型的元素,发现并没有保证元素的唯一性
2.怀疑在比较元素的时候,通过object类中的equals的方法来比较,比较的是对象的地址值,所有地址值都是不同的,因此没有去重成功
3.重写equals方法,比较对象中的数据是否全部相同,发现重写之后,equals中的方法没有调用。
4.考虑到Hashset使用了哈希存储元素,考虑和HashCode方法可能有关,重写HashCode方法。
5.在重写hashCode方法之前调用的是sunper.hashCode,其中super指的是Object类型的对象,Object会根据不同的对象生成不同的数字,这也是代表生成不同的对象,生成不同的数字,代表不同的对象,Hashset中就无法给这些不同的对象去重。
6.重写hashCode,让所有的Person对象都生成相同的哈希值0(相同的对象,必须有相同的哈希值,不同的对象,可以有不同的哈希值),相同的数字,无法表示相同的对象
7.重写hashcode方法,发现再次运行测试类,去重成功,equals方法被调用。
实现过程:
在这里插入图片描述
在这里插入图片描述
HashSet保证元素唯一性的原理的总结:
1.某个对象obj,在即将要存储到HashSet集合的时候,首先要计算obj的hashCode值
2.在集合中所有的元素的哈希值,都和obj的哈希值不同,说明在集合中不存在obj,可以将obj储存在HashSet中
3.在集合中有若干的哈希值,和哈希值的相同,并不能说明obj已经存在集合中,需要使用equals和obj比较是否和哪些与自己哈希值相同的元素是否相同。
4.如果这些元素的所有的和obj比较equals之后,都不相同,那么说明obj不存在与集合中去了。可以存储在Hashset中去
5.如果这些元素有任意的一个和obj比较equals后发现相同,那么就说明obj已经存在于集合中了,所有obj就不能存储了,所有了就存储失败。
HashSet的内存图示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值