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); } }}

猜你喜欢

转载自blog.csdn.net/qq_28126793/article/details/79602690