HashSet 源码解析

1、简述
  • 本篇内容我们来聊聊我们日常开发中经常使用的一个类 HashSet,相信大家都不陌生。
2、归纳
  • 继承了 AbstractSet 抽象类,实现了 Set 接口,实现了 Cloneable 和 Serializable 接口,所以支持复制(拷贝)、序列化。
  • 默认容量为16,负载因子0.75,其实内部就是包装了一个 HashMap,HashMap 的 key 放的是其存入的值,value 放的是一个 Object 对象。
  • 单线程安全,多线程不安全。
3、分析
3.1、成员变量
public class HashSet<E> extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {
    
    // 序列化唯一表示 UID
    static final long serialVersionUID = -5024744406713321676L;
    // 底层使用 HashMap 来保存 HashSet 中所有元素
    private transient HashMap<E,Object> map;

    // 定义一个虚拟的 Object 对象作为 HashMap 的 value,将此对象定义为 static final
    private static final Object PRESENT = new Object();
    
    ...
    
}
3.2、构造方法
public class HashSet<E> extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {
    
    ...
    
    /**
     * 无参构造函数
     * 实际底层会初始化一个空的 HashMap,并使用默认初始容量为 16 和加载因子 0.75
     */
    public HashSet() {
        map = new HashMap<E, Object>();
    }

    /**
     * 有参构造函数
     *
     * @param initialCapacity 初始容量
     */
    public HashSet(int initialCapacity) {
        map = new HashMap<E, Object>(initialCapacity);
    }

    /**
     * 有参构造函数
     *
     * @param initialCapacity 初始容量
     * @param loadFactor      加载因子
     */
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<E, Object>(initialCapacity, loadFactor);
    }

    /**
     * 有参构造函数
     *
     * @param c 其中的元素将存放在此 set 中的 collection
     */
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<E, Object>(Math.max((int) (c.size() / .75f) + 1, 16));
        addAll(c);
    }

    /**
     * 有参构造函数
     * 实际底层会以指定的参数构造一个空 LinkedHashMap 实例来实现。
     *
     * @param initialCapacity 初始容量
     * @param loadFactor      加载因子
     * @param dummy           标记
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<E, Object>(initialCapacity, loadFactor);
    }
    
    ...
    
}
3.3、增操作
public class HashSet<E> extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {
    
    ...
    
    /**
     * 添加元素
     *
     * @param e 待添加的元素
     * @return 添加成功返回 true,添加失败返回 false
     */
    public boolean add(E e) {
        return map.put(e, PRESENT) == null;
    }
    
    ...
    
}
3.4、删操作
public class HashSet<E> extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {
    
    ...
    
    /**
     * 删除元素
     *
     * @param o 待删除的元素
     * @return 删除成功返回 true,删除失败返回 false
     */
    public boolean remove(Object o) {
        return map.remove(o) == PRESENT;
    }
    
    ...
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值