public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
HashSet继承AbstractSet类,实现Set、Cloneable、Serializable接口。
有四种构造函数
//默认构造函数,创建一个大小为16的容器,加载因子为0.75 public HashSet() { map = new HashMap<>(); }
// 带集合的构造函数
public HashSet(Collection<? extends E> c) {
// 因为从HashMap的效率(时间成本和空间成本)考虑,HashMap的加载因子是0.75。
// 当HashMap的“阈值”(阈值=HashMap总的大小*加载因子) < “HashMap实际大小”时,就要将HashMap的容量翻倍。
// 所以,(c.size()/.75f) + 1 计算出来的正好是总的空间大小。
map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
// 将集合(c)中的元素都添加到HashSet中
addAll(c);
}
// 指定HashSet初始容量和加载因子的构造函数 public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,Object>(initialCapacity, loadFactor); }
// 指定HashSet初始容量的构造函数 public HashSet(int initialCapacity) { map = new HashMap<E,Object>(initialCapacity); }
二、主要方法
2.1 add()方法
底层利用了HashMap键进行了元素的添加。
HashMap的put()方法中,该方法的返回值是对应HashMap中键值对中的值,
//如果当前列表中没有e则将e加进去 public boolean add(E e) { return map.put(e, PRESENT)==null; }
2.2 clear()方法
public void clear() { map.clear(); }
2.3 remove()方法
public boolean remove(Object o) { return map.remove(o)==PRESENT; }
public V remove(Object key) { Node<K,V> e; return (e = removeNode(hash(key), key, null, false, true)) == null ? null : e.value; }
2.4 contains()方法
底层实际调用HashMap的contains Key,判断是否包含指定key
public boolean contains(Object o) { return map.containsKey(o); }
2.5 iterator()方法
public Iterator<E> iterator() { return map.keySet().iterator(); }