java hashset源码解析,Java记录 -70- HashSet源码剖析

HashSet不包含重复元素,由哈希表支持。

下面我就开始剖析下HashSet的源代码:

首先从构造方法开始;private transient HashMap map;

public HashSet() {

map = new HashMap();

}

public HashSet(Collection extends E> c) {

map = new HashMap(Math.max((int) (c.size()/.75f) + 1, 16));

addAll(c);

}

public HashSet(int initialCapacity, float loadFactor) {

map = new HashMap(initialCapacity, loadFactor);

}

public HashSet(int initialCapacity) {

map = new HashMap(initialCapacity);

}

我们会惊奇的发现,HashSet的构造函数中竟然都做了HashMap的构造,直接使用HashMap。可是HashMap是键值映射的,HashSet是存对象的,这都可以吗?带着这个问题,我们接着向下看:// Dummy value to associate with an Object in the backing Map

private static final Object PRESENT = new Object();

public Iterator iterator() {

return map.keySet().iterator();

}

public int size() {

return map.size();

}

public boolean isEmpty() {

return map.isEmpty();

}

public boolean contains(Object o) {

return map.containsKey(o);

}

public boolean add(E e) {

return map.put(e, PRESENT)==null;

}

public boolean remove(Object o) {

return map.remove(o)==PRESENT;

}

public void clear() {

map.clear();

}

由上面的一系列方法可以看出,HashSet就是一个壳啊,内部都是调用了HashMap的方法来实现。

add方法是将要添加的元素作为HashMap的key添加的,HashMap的key不能重复,这样HashSet的元素也就不会重复了,高明啊。那么HashMap的值又存的什么呢?PRESENT,一个静态的,Object类型的变量。这个HashMap中key存放了HashSet要存放的元素,而value则存放了统一的一个静态的Object变量。这个PRESENT为什么要static final的呢?省空间呗。

如此看来,HashSet的实现好简单啊,完全借用了HashMap来构造使用,所有的实现都交给了HashMap。HashMap又是怎么实现的呢?让我们期待HashMap源代码的剖析。

你可能感兴趣的:(java,hashset源码解析)