前言
Set集合不能存储重复的元素
Set实现
这里我们主要了解实现Set接口的两个类,HashSet、LinkedHashSet
HashSet
数据结构
HashSet中使用Hash表和链表存储元素。(Hash表使用数组作为存储结构,对元素进行hash运算之后得到元素的存储位置上的单向链表,如果链表为空,则直接放入元素,如果链表不为空,则依次判断链表中是否存在相同的元素,存在则不再添加元素,如果不存在则添加到链表中)
优劣性
- HashSet 中存储的元素过多时,会进行Hash表的扩容,扩容之后的Hash表中的元素需要进行重新散列。
- 添加元素时,通过Hash算法定位存储元素的位置,速度很快
- 移除元素时,通过Hash算法定位移除元素的位置,速度很快
- 查询元素时,通过Hash算法定位待查询元素的位置,速度很快
- 由于使用Hash表和链表的存储结构,导致遍历出来的元素时无序的(存取顺序不一致)
LinkedHashSet
数据结构
LinkedHashSet中使用Hash表和链表存储元素。同时使用了双向循环链表,用于保证存储元素的有序性(此处不过多介绍)。
优劣性
- HashSet 中存储的元素过多时,会进行Hash表的扩容,扩容之后的Hash表中的元素需要进行重新散列。
- 添加元素时,通过Hash算法定位存储元素的位置,速度很快
- 移除元素时,通过Hash算法定位移除元素的位置,速度很快
- 查询元素时,通过Hash算法定位待查询元素的位置,速度很快
- 遍历集合时,通过双向循环链表依次取出元素,能够保证元素的有序性(存取顺序一致)
HashSet与LinkedHashSet
LinkedHashSet与HashSet具备相同的存储结构(Hash表与链表),都不能存放重复的元素,唯一不同的是,LinkedHashSet维护了一个双向循环列表,用于存储元素的存储的顺序,保证了LinkedHashSet的有序性(存取顺序一致),而HashSet并不具备。