JDK源码深入学习之HashSet

HashSet概述

1.HashSet底层基于HashMap
2.HashSet存放的元素无序不重复
3.HashSet继承AbstractSet类,实现了set,Cloneable,java.io.Serializable接口
4.HashSet线程不安全
类图:
在这里插入图片描述

HashSet源码解读

1.HashSet成员变量
HashSet直接使用HashMap存放数据,因HashMap的Key必须唯一,所以可以将我们需要存放的数据放到Key保证不重复,而所有的value对应一个内部的对象PRESENT

    // 实际存放数据的hashmap
    private transient HashMap<E,Object> map;

    // hashmap的value值
    private static final Object PRESENT = new Object();

2.HashSet构造器
(1)无参构造器

    // 无参构造器
    public HashSet() {
        map = new HashMap<>();
    }

(2)指定一个集合的构造器

    // 指定一个集合的有参构造器
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

(3)指定容量和加载因子的构造器

    // 指定容量和加载因子的构造器
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

(4)指定初始容量的构造器

    // 创建initialCapacity大小的HashSet
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

3.添加一个元素add()方法
■ 往HashSet中添加元素,就是添加一个HashMap存放对应key,value
■ HashMap中的key实际就是要添加的元素,value对应一个内部的对象PRESENT
■ HashMap中的key不能重复,因此HashSet元素不重复
■ HashMap第一次添加成功会返回null,再次插入同样key的元素,会用新的value替换原来的旧的value,并且返回旧的value

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

4.移除一个元素remove()
■ HashSet删除元素,调用的HashMap的remove()方法

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

5.迭代器取得元素
■ HashSet没有get方法,采用迭代器遍历获取

    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

6.判断是否包含某个元素
■ 用HashMap的containsKey(key)方法判断

    public boolean contains(Object o) {
        return map.containsKey(o);
    }

总结

■ HashSet底层是HashMap,HashMap的key存放元素,value存放内部的对象PRESENT
■ HashSet以HashMap不能存储重复的Key来实现元素不重复
■ HashSet以HashMap的key是基于hashcode存储来保证无序
■ HashSet线程不安全

猜你喜欢

转载自blog.csdn.net/qq_38425803/article/details/107159466