深入理解Java集合和Map 3:Set接口的实现类HashSet和TreeSet源码分析及其相关特点
Set接口
Set接口父接口为Collection,爷接口为Iterator接口,这也表明遍历Set实现类可采用迭代器。
本处只介绍HashSet和TreeSet两个实现类,从部分源码分析一些特性。
HashSet实现类
- 源码:构造方法,如下所示,可知在HashSet底层实现是HashMap。
public HashSet() {
map = new HashMap<>();
}
- 为什么HsahSet不能够有重复的元素?源码分析可知,在put元素时,将要添加的元素作为key,值为一个Object类,HashMap的key不能够重复,所以HashSet元素也不能重复。同时,HashSet的remove方法也调用的hashMap的remove方法,此处不做介绍,后续介绍HashMap文章会详细剖析
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;//map.put(e, PRESENT)返回值为空则表示put成功,详情可见put方法,此处不做介绍。
}
- HashSet可以加入null值,但不允许加入相同的值。
- 从上述源码也可知道HashSet线程不安全。
- HashSet的底层为HashMap,HashMap由数组、链表、红黑树构成,HashSet基本与hashMap一致。
- 更详细关于HashMap知识详见[]
TreeSet实现类
待续...