HashSet实现了Set接口,但是内部实现却是基于HashMap的。它的原理就是添加到集合里的值或者对象都成为了HashMap的key. 而HashMap有了Key之外,值怎么办呢。HashSet默认提供了一个供所有key共享的一个Object对象PRESENT.什么意思呢?下面会分析到。
也正是HashSet是基于HashMap的,那么我们知道HashMap的key允不允许重复,是不允许的嘛,判断依据equals是否相等,而且hashCode是否一样。既然HashMap的key不允许相等,就决定了添加到HashSet的值是不能相等的。
private transient HashMap<E,Object> map;
// 提供了一个供所有key共享的一个Object对象
private static final Object PRESENT =new Object();
构造方法:
public HashSet() {
map = newHashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = newHashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity, floatloadFactor) {
map = newHashMap<>(initialCapacity, loadFactor);
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
我们每添加一个元素E到HashSet,其实就是在HashMap里面存了一个
<KEY=E,VALUE= PRESENT>
public Iterator<E> iterator() {
return map.keySet().iterator();
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public int size() {
return map.size();
}
public boolean contains(Object o) {
return map.containsKey(o);
}
从上面的方法得知,其实就是对HashMap进行的一些操作而已。