JDK源码解析---HashSet

1.概述

内部组合了一个HashMap,所有的操作都是基于HashMap的操作。

因为HashSet存的值对应HashMap中的key,所以是唯一的。

HashSet是无序的。

了解HashSet的源码都是和HashMap相关。底层调用HashMap提供的api

2.类图

在这里插入图片描述

继承了AbstractSet,该类仅实现了3个方法。hashCode、equals、removeAll

实现了Set接口,定义了一些基本的操作

实现了序列化接口

实现了克隆接口

3. 属性

private transient HashMap<E,Object> map;//内部组合了一个HashMap,所有的操作都基于HashMap
private static final Object PRESENT = new Object();//因为HashSet实际存储的就是HashMap中的key,那么value就使用这个常量来替代。

4.构造方法

4.1 无参构造

实际就是new了一个HashMap

public HashSet() {
    map = new HashMap<>();
}

4.2 带集合参数的构造

构建一个HashMap 然后将集合C中的元素放入到HashMap中。

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

4.3 初始容量和装载因子的构造

根据初始容量和装载因子构建HashMap

public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

4.4 初始容量的构造

根据初始容量构建HashMap

public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}

5. 获得集合迭代器

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

6. 返回集合大小

public int size() {
    return map.size();
}

7. 判断是否为空

public boolean isEmpty() {
    return map.isEmpty();
}

8. 判断对象存不存在

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

9. 添加元素

所有的键值对 值都是一个常量PRESENT

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

10.移除元素

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

11.清空集合

public void clear() {
    map.clear();
}

猜你喜欢

转载自blog.csdn.net/gongsenlin341/article/details/108020778