深入理解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实现类

待续...