Java集合Set-HashSet

Java集合Set-HashSet

  1.简介

      HashSet是一个不可重复的,线程不安全非同步的,可以插入null值的集合。

      继承了AbstraccSet父类,并且实现了Set,Cloneable,Serializable接口。

      由HashMap实现的。相当于只有一个Key的HashMap,因此元素是不能重复。

      在多线程中可以使用:Set s = Collections.synchronizedSet(new HashSet(...)) 来保证多线程的同步访问。

二、实现

  对于HashSet来说,是基于HashMap来实现的。底层的所有操作都是通过HashMap来操作元素的。

ublic class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;
    //用来实现的HashMap
    private transient HashMap<E,Object> map;
    //定义一个虚拟的Object对象作为map的value,将此对象定义为static final
    private static final Object PRESENT = new Object();
    //空构造方法,实现一个HashMap
    public HashSet() {
        map = new HashMap<>();
    }

    /**
     *
//Math.max((int) (c.size()/.75f) + 1, 16) 先计算传入集合的总的空间大小(),然后和16比较取最大值。
public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } /** * @param initialCapacity 初始容量 * @param loadFactor 加载因子 */ public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } /** *构造一个LinkedHashMap,没有public 只能用于包访问权限,实际上只支持LinkedHashSet */ HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); } //调用map的keySet来返回所有的key public Iterator<E> iterator() { return map.keySet().iterator(); } public boolean contains(Object o) { return map.containsKey(o); } //将e作为元素key,PRESENT作为value,进行put,因此key不会重复
public boolean add(E e) { return map.put(e, PRESENT)==null; }     //调用map的Clone @SuppressWarnings("unchecked") 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); } }}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值