HashSet类图
HashSet是java.util包下Set接口下的一个集合子类,他是无序、不可重复、线程不安全的。底层是通过HashMap实现的。
- AbstractSet类:Set的默认实现抽象类,定义了Set的一些通用方法。
- Cloneable接口:实现对象拷贝必须要实现的接口。
- Serializable接口:实现序列化必须要实现的接口。
- Set接口:Set集合的顶级接口。
HashSet属性
HashSet的属性如上所示,下面一一分析:
serialVersionUID
static final long serialVersionUID = -5024744406713321676L;
序列化ID
map
private transient HashMap<E,Object> map;
用HashMap来存储数据,transient修饰,不可被序列化,他是通过重写readObject和writeObject方法来实现序列化的
PRESENT
private static final Object PRESENT = new Object();
用来填充HashMap里的value,一个static、fianl修饰的Object对象。
HashSet常用API
public HashSet() {
map = new HashMap<>();
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
构造函数
- 空参:直接调用HashMap的空参构造,即初始容量为16,负载因子0.75
- 一个参数:传入初始容量大小
- 两个参数:传入初始容量大小和负载因子
- Collection参数:传入一个Collection体系的集合,调用addAll方法将该集合中的元素全部添加进去
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
add方法:添加一个元素。直接调用的是HashMap的put方法,value为之前定义的PRESENT。
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
remove方法:移除一个元素,调用HashMap的remove方法去移除该元素,如果返回值和填充的value相等即删除成功。
public void clear() {
map.clear();
}
clear方法:清空容器。也是调用HashMap的clear方法去执行。
public int size() {
return map.size();
}
size方法:返回容器中元素个数。
public boolean isEmpty() {
return map.isEmpty();
}
isEmpty方法:判空。
public boolean contains(Object o) {
return map.containsKey(o);
}
contains方法:判断是否包含某个元素。
public Iterator<E> iterator() {
return map.keySet().iterator();
}
iterator方法:返回一个迭代器。
总结
HashSet是一个无序,不可重复,非线程安全的集合,底层通过HashMap实现,定义一个空Object对象来填充value值,因此它的初始化容量大小、负载因子、扩容等机制和HashMap一致。
参考HashMap:https://blog.csdn.net/qq_42191317/article/details/96480436