HashSet

类的属性

public 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;
    // 用作hashmap所有键对应的值,为什么不设置成null呢?
    private static final Object PRESENT = new Object();
}

构造函数

HashSet()

    public HashSet() {
        // 实例化一个hashmap对象,并将内部的一个map引用指向它
        map = new HashMap<>();
    }

HashSet()

    public HashSet(Collection<? extends E> c) {
        // 相当于HashMap(Colletion<? extends E>c)
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

其他构造函数与HashMap基本相同,不再累述

常用方法

contains(Object o)

    public boolean contains(Object o) {
        // 本质是调用hashmap的containsKey方法
        return map.containsKey(o);
    }

add(E e)

    public boolean add(E e) {
        // 本质是调用hashmap的put方法,对于hashmap的put方法返回值:如果put进去的key在hashmap中已经存在会返回oldValue(对HashSet来说就是PRESENT),如果put进去的key不存在就会返回null,这可以解释两个问题:1.为什么PRESENT不设计成null;2.为什么HashSet中的元素不可重复
        return map.put(e, PRESENT)==null;
    }

remove(Object o)

    public boolean remove(Object o) {
        // 本质是调用hashmap的remove方法,对于hashmap的remove方法的返回值:如果对应的key存在,删除key-value键值对之后返回value,如果不存在返回null
        return map.remove(o)==PRESENT;
    }
posted @ 2018-01-31 17:05  unbelievableme  阅读(182)  评论(0编辑  收藏  举报