关于HsahSet的元素和HashMap中key的存储原理

关于HsahSet的元素和HashMap中key的存储原理

1.使用自定义类的话 如果重写equals的,添加相同的元素,任然会出现两个元素的情况

2,hashset的底层是hashmap,使用的是数组加单链表的形式,
加入的元素进去时,会先计算该元素的hashcode的值,最后转换为数组下标
所以单链表连起来的都是hashcode相同的值,但是此时的元素不一定相同,

Person类中只重写了equals 方法,并且创建两个名字相同的类 加入道hashset中
以下是代码的结果
Person类equals 重写Person类中只重写了equals方法
创建主方法,并且加入到hashset中,size的长度
在这里插入图片描述
只重写了equals方法,但是没有hashcode的方法的话,p1和p2的hashcode仍旧不相同
在这里插入图片描述
以上的图片表示了类的对象的名字相同,但是hashcode的值不相同,表明hashset关于相同的元素的区别的与hashcode的值是否相同!

此时我们同时重写Person类中的equals方法和hashcode的方法,
在这里插入图片描述
同时重写equals和hashcode的方法时,可以确认p1和p2的hashcode的值相同了!
在这里插入图片描述
此时我们同时存储p1和p2到hashset中,再去查看此时的hashset的长度
在这里插入图片描述
3.可以看出此时的hashset的长度为1了,表明hashset的长度变为1了 和上面没有重写hashcode的类相比,此时的hashset判断出了p1和p2的值相同了。
从以上的代码表示,hashset是寻找hashcode的是否相同,再将相同的hashcode的放到相同的数组下标下面然后再将hashcode相同的类连在一起,此时的equals相同,会将该元素自动覆盖掉,但是hashcode算出来相同时,表明该元素的值一定相同,当有两个名字的类不相同的时,可见hashcode的值也不相同,但是java有个算法,此时算出hashcode的值时,会拿该类的hashcode拿去取余,所以虽然有的hashcode的值不相同时,取余的话,此时的值有可能相同,所以在同一个数组下标的hashcode的虽然不相同,但是取余之后相同,就该元素连起来成为一个单链表,所以就说:equals相同,必定hashcode的值一定相同,因为相同的hashcode的取余之后一定相同,但是有一个表明hashcode相同,但是equals不一定相同,是因为hashcode不同的值的两个值,但是取余之后可能相同,就出现了hashcode相同,但是equals不相同的结论!

并且hashmap的key和hashset的元素存储方式相同,搞懂了hashset,hashmap的key存储原理也就明白了!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值