美文网首页
Java集合类源码之Set——HashSet

Java集合类源码之Set——HashSet

作者: 丁木木木木木 | 来源:发表于2017-03-05 15:01 被阅读122次

    主要内容:

    • HashSet继承关系
    • 关键属性
    • 构造函数

    HashSet概述

    • 没有重复元素的集合。底层基于HashMap来实现。
    • 非线程安全,创建线程安全的HashMap可以使用Collections.synchronizedSet
    Set s = Collections.synchronizedSet(new HashSet(...));
    

    源码分析

    继承关系

    HashSet继承关系.png
    public class HashSet<E>
        extends AbstractSet<E>
        implements Set<E>, Cloneable, java.io.Serializable
    
    • 继承AbstractSet抽象类,实现Set接口
    • 实现java.io.Serialization接口,支持序列化
    • 实现Cloneable接口,支持对象克隆,浅复制

    关键属性

        //使用HashMap来保存HashSet的元素
        private transient HashMap<E,Object> map;
    
        //HashSet只使用到key,因此使用一个静态常量来充当HashSet的value值
        private static final Object PRESENT = new Object();
    

    PRESENT这个变量到底是用来干嘛的??

    构造函数

        //使用默认容量大小16以及加载因子0.75初始化HashMap,构造HashSet
        public HashSet() {
            map = new HashMap<>();
        }
    
        //初始化指定集合和默认加载因子0.75的map,构造HashSet
        public HashSet(Collection<? extends E> c) {
            map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
            addAll(c);
        }
    
        //使用指定容量大小和加载因子初始化map,构造HashSet
        public HashSet(int initialCapacity, float loadFactor) {
            map = new HashMap<>(initialCapacity, loadFactor);
        }
    
        //使用指定容量大小和默认加载因子0.75初始化map,构造HashSet
        public HashSet(int initialCapacity) {
            map = new HashMap<>(initialCapacity);
        }
    
        //包访问权限,构造空的LinkedHashSet
        HashSet(int initialCapacity, float loadFactor, boolean dummy) {
            map = new LinkedHashMap<>(initialCapacity, loadFactor);
        }
    

    相关文章

      网友评论

          本文标题:Java集合类源码之Set——HashSet

          本文链接:https://www.haomeiwen.com/subject/hausgttx.html