Java集合类源码之Set——HashSet

主要内容:

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

HashSet概述

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

源码分析

继承关系

Java集合类源码之Set——HashSet_第1张图片
HashSet继承关系.png
public class HashSet
    extends AbstractSet
    implements Set, Cloneable, java.io.Serializable
  • 继承AbstractSet抽象类,实现Set接口
  • 实现java.io.Serialization接口,支持序列化
  • 实现Cloneable接口,支持对象克隆,浅复制

关键属性

    //使用HashMap来保存HashSet的元素
    private transient HashMap 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 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)