JDK源码之HashSet

1.定义

  HashSet继承AbstractSet类,实现Set,Cloneable,Serializable接口。Set 接口是一种不包括重复元素的 Collection,它维持它自己的内部排序,所以随机访问没有任何意义。

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable

  HashSet的底层是靠HashMap进行存储的,map中的key值中存储着set集合中的元素,不允许重复,而value值则使用PRESENT进行填充。

private transient HashMap<E,Object> map;

// 定义一个Object对象作为HashMap的value值
private static final Object PRESENT = new Object();

  HashSet的构造函数

   //构造一个全新空的set,默认大小是16,默认装载因子是0.75 

  public HashSet() { map = new HashMap<>(); }
  //构造一个包含指定集合中元素的新集合,使用默认的构造因子0.75,如果集合中的元素太少,就采用默认大小16
  //如果Collection为空,则抛出空指针异常 public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); }
  //构造一个具有指定初始大小和装载因子的HashSet public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } //构造一个指定初始大小和默认装载因子为0.75的HashSet public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } //该构造函数为此包私有,仅仅由子类LinkedHashSet使用,构造一个新的空链接哈希集合
  //且指定大小和构造函数 HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }

 2.主要方法

  因为HashSet是基于HashMap进行实现的,所以HashSet的方法实现比较简单,直接调用Map的函数即可。

  //返回元素迭代器,元素以无特定顺序返回
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

    //返回Set大小
    public int size() {
        return map.size();
    }

   //返回Set中是否为空
    public boolean isEmpty() {
        return map.isEmpty();
    }

    //返回集合中是否包含该元素
    public boolean contains(Object o) {
        return map.containsKey(o);
    }

    //添加元素到集合中,如果集合不包含该元素,则添加。如果包含,则集合保持不变并且返回。
  //此时map中添加的value值是PRESENT,该对象是static final对象 public boolean add(E e) { return map.put(e, PRESENT)==null; } //如果集合包含该元素,则删除元素 public boolean remove(Object o) { return map.remove(o)==PRESENT; } //清空Set public void clear() { map.clear(); } //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); } }

猜你喜欢

转载自www.cnblogs.com/xiaobaituyun/p/10573867.html
今日推荐