HashSet源码分析

Set家族一览:

Set层次

HashSet简介

Set是Collection三大接口其中之一,意为集合,且元素不能重复。Set接口中的方法和Collection中的方法完全一致,只是起到一个标记名的作用。

HashSet是哈希集的意思,就是通过hashcode来实现set不能出现重复元素的一个实现类。

内部其实是通过哈希表HashMap来实现的,实际上set中存放的元素是内部hashmap中的键:

private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();//所有的键对应的值都是一个冗余的Object对象

在构造方法中初始化哈希表:

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

浪费时间警告:这是一个纯HashMap实现的类

重载的构造方法

public HashSet(Collection<? extends E> c)

通过一个集合来构造HashSet,默认哈希表的容量是集合的容量*4/3 + 116中的最大值

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

public HashSet(int initialCapacity, float loadFactor)

这个实际上就是提供两个构造HashMap的参数,一个是初始大小,一个是负载因子。

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

public HashSet(int initialCapacity)

这个就是提供HashMap的初始大小。

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

重要方法

public int size()

HashMap的size

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

public boolean contains(Object o)

HashMap中是否有对应的键。

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

public boolean add(E e)

将一个记录插入HashMap

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

public boolean remove(Object o)

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

总结

这是一个纯使用HashMap实现的数据结构。
仔细看了一下TreeSet也是用TreeMap实现的,那我就不搞TreeSet了。

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/hashset%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90/

发表评论

电子邮件地址不会被公开。