HashSet源码解析

/ Java / 没有评论 / 328浏览

今天我们分析一下HashSet的底层实现,因为HashSet底层是通过HashMap实现的。 所以HashSet底层也是通过哈希表的数据结构存储的。所以这里我们就不在介绍有关数据结构方面的知识了,有不了解哈希表底层实现的可以去浏览HashMap这篇文章。下面我们将和其它集合一样,从HashSet的初始化方面着手,来分析一下HashSet的底层实现。

public HashSet() {
map = new HashMap<>();
}

我们看到,在HashSet中的无参构造方法中,直接创建了一个HashMap对象。这就证明了我们上述所说的,HashSet底层是通过HashMap实现的。我们在分析HashMap那篇文章中有提到过。如果我们使用无参的构造方法来创建HashMap对象,那么此时底层的数据结构不会初始化,第一次初始化发生在第一次调用put方法的时候。所以我们在这里可以说,当我们调用无参构造方法来创建HashSet对象时,底层的数据结构也不会执行初始化。那么它第一次初始化的动作,也应该发生在第一次调用添加元素的方法中,也就是HashSet中的add方法。下面我们看一下该方法的具体的逻辑。

private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

上面代码是HashSet中add方法,我们看到该方法的逻辑是直接调用了HashMap中的put方法,并将添加的元素的值设置为HashMap中的key,value存储一个Object对象。

分析到这里使我们知道HashSet有以下几点特性,它们分别是: