Set
set 的特点就是 【元素唯一,不重复】
子类经常用到的有两个:HashSet 和 TreeSet
HashSet
基于 HashMap 实现
元素唯一,不重复
允许null
无序
非线程安全,在多线程访问时显式同步对 HashSet 的并发访问。这点我们后面会在分析 HashMap 的时候一起分析。
实现 Set 接口
由于内部实现为 Hash 表,时间复杂度为 O(1)。
源码走起:
可以看到 HashSet 实现了 Set 接口、Cloneable 接口、Serializable 接口。
内部维护了一个 HashMap,看到这里,就恍然大悟了吧,其实就是用 HashMap 实现的 HashSet。
![](https://img-blog.csdnimg.cn/img_convert/8a141a92d9c41df22cb5466dd65b29ce.png)
看一下它的 CRUD
我们只分析 add 好了,其他的同理。
add 接口,其实内部调用的是 hashMap 的 put 方法,将 HashSet 的元素其实作为 HashMap 的key,value是一个静态常量的 Object。
![](https://img-blog.csdnimg.cn/img_convert/8ff6b1449499daac972767b0ead73d11.png)
![](https://img-blog.csdnimg.cn/img_convert/8e55aaa26197040272fe36d351a2fc4f.png)
TreeSet
元素唯一,不重复
不保留元素的插入顺序
按升序对元素进行排序
非线程安全的,同样,后面我们再讲。
TreeSet 和 HashSet 类似,其 CRUD 我们就不再看了,同理的。
我们看到它的内部也维护了一个 Map,这个map 是NavigableMap,继承自 SortedMap,是一个接口,使用的是 TreeMap 来进行 CRUD,构造器中进行了 new TreeMap()。TreeMap 我们等到后面再讲。
![](https://img-blog.csdnimg.cn/img_convert/1b80d9926acae21d137e36a5dfed2df2.png)