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;
至此鲜花赠自己,纵马踏花香自有。