文章目录
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();
}