Set集合不重复原理

在使用Set集合保存元素的时候,我们发现是不允许保存重复元素的。

如图所示,我们发现相重复的元素是不会被继续保存到Set集合中去的;这是为什么呢,就需要了解Set集合添加元素的原理。

 如上图所示,add方法中底层使用的是map中的put方法。

 

 在 putVal方法中我们可以看到用Node<k,v>数组来保存key和value;Node是HashMap的内部类;

 在Node类中可以看到四个成员变量;其中hash代表哈希值;key代表我们存入的元素;next表示下一个元素地制值,体现了链表的结构。

 

 

 

 

由上述图片所知,Node<k,v>数组长度为16

 

可以简单的看作是把哈希值做了一个操作;找到新添加的元素在数组中的索引值位置,如果该索引值下没有元素,则直接添加该元素, 如果该索引值下有元素则比较哈希值,如果哈希值相同,则比较地址值或者进行equals比较;故哈希值相同且地址值或者equals比较相同则代表重复则不新增;否则可以新增。

则新增过程可以总结为:

新增过程:
1.计算新增元素的哈希值
2.哈希值%数组长度,计算出新增元素的索引值位置
                                 如果该位置为null:则直接新增
                                 如果该位置有元素:判断是否重复
                                 重复:不新增
                                 不重复:新增,挂到链表的最后位置
 
                                 判断是否重复的标准:
                                 a.  两个元素的哈希值相同 && (地址值相同 || equals相同)

当我们在Set集合新增自定义类元素时发现相同的元素还是可以添加进去,主要是由于我们没有覆盖重写hashCode方法和equals方法。当我们覆盖重写后:

就不会出现上述问题了。

所以我们在使用Set集合保存元素的时候,是不允许保存重复元素的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值