简介
基于HashMap的Set接口实现。它不保证集合的迭代顺序。特别是,它不能保证顺序会随着时间的推移保持恒定,当扩容时顺序将调整。此类允许null元素。
类继承关系
属性
-- 创建的HashMap
private transient HashMap<E,Object> map;
-- 因为底层使用HashMap实现,要存key,value,这个固定值就是所有数据的value了
private static final Object PRESENT = new Object();
构造方法
-- 这里构造方法是创建了一个HashMap
public HashSet() {
map = new HashMap<>();
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
-- 给LinkedHashSet使用
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
方法
-- 添加 调用map的put方法
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();
}
public boolean isEmpty() {
return map.isEmpty();
}
public int size() {
return map.size();
}
-- hashset没有提供get方法
public boolean contains(Object o) {
return map.containsKey(o);
}
-- 调用map的keyset迭代 更像是hashmap留下的钩子
public Iterator<E> iterator() {
return map.keySet().iterator();
}
-- 重写克隆方法 实现深拷贝
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
总结
内部使用HashMap的key存储元素,来保证数据不重复
线程不安全
无序
允许key为null
没有get方法
支持快速失败