欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(源码分析)HashSet源码分析

程序员文章站 2022-07-15 20:38:08
...

说明:当前HashSet的版本为JDK1.8.0_144

成员变量

private transient HashMap<E,Object> map; // HashSet底层是以HashMap来储存数据的,key为add()中的元素,value为PRESENT值
private static final Object PRESENT = new Object(); // 空的Object对象,作为HashMap中的value值

构造方法

HashSet():无参构造

/**
 * 使用默认初始化容量16和默认的加载因子0.75,初始化HashMap
 */
public HashSet() {
    map = new HashMap<>();
}

HashSet(int initialCapacity):指定初始化容量

/**
 * 使用指定的初始化容量initialCapacity和默认的加载因子0.75,初始化HashMap
 */
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}

HashSet(int initialCapacity, float loadFactor):指定初始化容量和加载因子

/**
 * 使用指定的初始化容量initialCapacity和指定的加载因子loadFactor,初始化HashMap
 */
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

HashSet(Collection<? extends E> c):在初始化时构造一组包含指定集合中的元素的HashSet对象

/**
 * 在初始化HashMap时添加一个集合
 */
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

/**
 * 向HashMap中添加一个集合
 */
public boolean addAll(Collection<? extends E> c) {
    boolean modified = false;
    for (E e : c)
        if (add(e))
            modified = true;
    return modified;
}

/**
 * 向HashMap中添加元素
 */
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

成员方法

add(E e)

add(E e)执行原理:

1、调用HashMap中的put方法进行添加元素

add(E e)源码:

/**
 * 向HashMap中添加元素
 */
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

remove(Object o)

remove(Object o)执行原理:

1、调用HashMap中的remove方法进行添加元素

remove(Object o)源码:

/**
 * 移除HashMap中的元素
 */
public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

contains(Object o)

contains(Object o)执行原理:

1、调用HashMap中的containKey方法进行添加元素

contains(Object o)源码:

/**
 * 判断HashMap中是否存在指定元素
 */
public boolean contains(Object o) {
    return map.containsKey(o);
}

clear()

clear()执行原理:

1、调用HashMap中的clear方法进行添加元素

clear()源码:

/**
 * 将HashMap中的元素清空
 */
public void clear() {
    map.clear();
}

isEmpty()

isEmpty()执行原理:

1、调用HashMap中的isEmpty方法进行添加元素

isEmpty()源码:

/**
 * 判断HashMap中的元素个数是否为0
 */
public boolean isEmpty() {
    return map.isEmpty();
}

clone()

clone()执行原理:

1、浅克隆一个HashSet集合

clone()源码:

/**
 * 克隆
 */
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);
    }
}

size()

size()执行原理:

1、调用HashMap中的size方法进行添加元素

size()源码:

/**
 * 返回HashMap中的元素个数
 */
public int size() {
    return map.size();
}

iterator()

iterator()执行原理:

1、返回HashMap中内部类KeyIterator中的iterator()方法

iterator()源码:

/**
 * 返回HashMap中内部类KeyIterator中的iterator()方法
 */
public Iterator<E> iterator() {
    return map.keySet().iterator();
}

spliterator()

spliterator()执行原理:

1、返回HashMap中内部类KeySpliterator实例

spliterator()源码:

/**
 * 返回HashMap中内部类KeySpliterator实例
 */
public Spliterator<E> spliterator() {
    return new HashMap.KeySpliterator<E,Object>(map, 0, -1, 0, 0);
}

总结

  • HashSet底层是使用HashMap来存储数据,key值为HashSet中的数据,value值为一个空的Object对象
  • HashSet的方法都是通过调用HashMap中的方法来实现的