天天看点

Java集合(10)——HashSet源码解析

类图

Java集合(10)——HashSet源码解析

官方文档

Java集合(10)——HashSet源码解析

成员变量

Java集合(10)——HashSet源码解析

成员方法

Java集合(10)——HashSet源码解析

成员方法源码解析

1.

public HashSet()

方法

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

源码解析:

  • 功能:无参构造函数
  • 源码思路:构造一个新的,空的HashMap实例,它有默认的初始化容量,容量为16,负载数为0.75

2.

public HashSet(Collection<? extends E> c)

方法

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

源码解析:

  • 功能:构造一个新的set集合的构造函数,该构造函数包含集合c中的元素
  • 源码思路:
    • 如果参数c的值是null,则抛出异常

3.

public HashSet(int initialCapacity, float loadFactor)

方法

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

源码解析:

- 功能:构造一个新的set集合的构造函数,参数initialCapacity为hash map的初始容量,loadFactor为hashset的装载系数

4.

public HashSet(int initialCapacity)

方法

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

源码解析:

  • 功能:构造一个新的set集合的构造函数,参数initialCapacity为hash map的初始容量

5.

HashSet(int initialCapacity, float loadFactor, boolean dummy)

方法

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }
           

源码解析:

  • 功能:构造一个新的,空的LinkedHashSet,这个构造函数只适用于LinkedHashSet

6.

public Iterator<E> iterator()

方法

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

源码解析:

  • 功能:返回集合的迭代器,通过调用map对象的keySet方法,获取set集合的所有值
  • 源码思路:
    • Set集合的操作都是通过map集合实现的,集合的返回元素的顺序是随机的,没有顺序

7.

public int size()

方法

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

源码解析:

  • 功能:返回集合中元素的个数
  • 源码思路:
    • 调用map的size方法

8.

public boolean isEmpty()

方法

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

源码解析:

  • 功能:判断集合是否为空
  • 源码思路:
    • 调用map的isEmpty方法,来判断集合是否为空

9.

public boolean contains(Object o)

方法

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

源码解析:

  • 功能:判断集合中是否包含元素o
  • 源码思路:
    • 调用map的containsKey方法,来判断o是否在集合中,Set集合实际存储在map中,set的值存储为map集合的键

10.

public boolean add(E e)

方法

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

源码解析:

  • 功能:向集合中添加元素e
  • 源码思路:
    • (1)调用map的put方法,将元素e插入到集合中,作为map的键存储起来,键对应的值为HashSet类的PRESENT成员变量
    • (2)如果集合中已经包含元素e,则不改变原集合,返回false;如果集合中不包含元素e,则向集合中添加元素e,返回true

11.

public boolean remove(Object o)

方法

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

源码解析:

  • 功能:将集合中的元素o移除
  • 源码思路:
    • (1)如果集合中存在元素o,则将其从集合中移除;

12.

public void clear()

方法

源码解析:

  • 功能:将集合中的全部元素移除
  • 源码思路:
    • 通过map的clear方法将集合中的元素全部移除

13.

public Object clone()

方法

@SuppressWarnings("unchecked")
    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);
        }
    }
           

源码解析:

  • 功能:浅拷贝
  • 源码思路:
    • 该方法只是完成了浅拷贝,集合中的元素本身没有被拷贝