HashSet源码分析

简介

基于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方法
支持快速失败

原文地址:https://www.cnblogs.com/paper-man/p/13284619.html