HashSet实现原理(面试必背)

HashSet

HashSet的底层实际上就是一个HashMap,是Java集合框架中的一个无序且不允许包含重复元素,只能存储一次null的集合类,HashMap详情可见>>>>>>HashMap实现原理(面试必背)

实现原理

HashSet的底层依赖于HashMap的数据结构,即一个哈希表,这个哈希表是一个数组,数组中的每个元素都是一个链表或红黑树(Java 8以后引入了红黑树优化),可以看见源码中HashSet的构造方法中都使用了HashMap

在这里插入图片描述

如何检查数据重复并且保证数据不重复

通过计算数据hsah值,加上equlas方法来检查数据重复,HashSet的add方法底层实际使用了HashMap的put,相当于使用了HashMap来避免重复(Key相同时会用新值覆盖旧值,HashMap比较Key时。先计算HashCode,再使用equlas,因为HashCode不一致,两个数据肯定不相等,HashCode相等,两个数据也不一定相等

HashSet的扩容机制

HashSet在被我们new时实际上是构建了一个HashMap,初始大小默认16,扩容机制因子0.75,这些都是使用的HashMap的特性
在这里插入图片描述

HashSet常用方法

add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false。
size():返回Set集合中的元素个数。
remove(Object obj):删除Set集合中的元素,删除成功返回true,否则返回false。
isEmpty():如果Set不包含元素,则返回 true ,否则返回false。
clear() : 移除此Set中的所有元素
contains(Object o):如果Set包含指定的元素,则返回 true,否则返回false
iterator():返回在此Set中的元素上进行迭代的迭代器。

HashSet的遍历方式

1.使用for循环遍历
在这里插入图片描述
2.使用迭代器遍历
在这里插入图片描述

线程安全问题:

HashSet使用了HashMap,HashMap不是线程安全的,因此HashSet也不是线程安全的,在多线程环境下使用时,需要进行额外的同步处理。

总结

1.无序且不可重复的集合,只能存储一次null
2.通过计算数据hsah值,加上equlas方法检查重复
3.HashSet底层就是个HashMap
4.线程不安全


下一篇 >>>>> HashMap实现原理(面试必背)

That’s it;

至此鲜花赠自己,纵马踏花香自有。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值