一、概念
HashSet 是 Java 中的一种集合类,它实现了 Set 接口,并使用哈希表(HashMap)作为其底层数据结构。哈希表是一种以键值对(key-value)形式存储数据的数据结构,它根据键的哈希值进行快速的查找、插入和删除操作
二、构造器
/**
* 默认的无参构造器,创建一个HashMap。
* 因此,默认加载因子0.75,默认初始容量16
*/
public HashSet() {
map = new HashMap<>();
}
/**
* 将参数c,也就是集合添加到HashMap中
* 默认加载因子0.75,容量大小是取 ((c.size()/.75f) + 1) 和 16 两个的最大值
* 也就是 c.size >= 12 时,容量为 ((c.size()/.75f) + 1)
* c.size < 12 时,容量为 16
*/
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
/**
* 创建一个容量为initialCapacity和加载因子为loadFactor的HashMap
* initialCapacity不能小于0; loadFactor不能小于等于0
*/
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
/**
* 创建一个容量为initialCapacity的HashMap
* 默认加载因子为0.75
*/
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
三、常用方法
/**
* 因为,HashSet的内部是基于HashMap实现的,而HashSet的元素都是存储在Key中
* 所以,PRESENT相当于占位符,作为HashMap每个Key的Value
* 并且该PRESENT被static修饰,也节省了内存空间,即不需要为每个Key分配一个Value
*/
private static final Object PRESENT = new Object();
/**
* 使用HashMap的put()方法将元素添加到内部的HashMap中
* true,即添加成功,说明集合中没有与元素e相同的元素
* false,即添加失败,说明集合中存在与元素e相同的元素
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
/**
* map.remove(o)也就是HashMap中的remove方法。根据Key删除键值对,并返回对应的value
* true,删除成功,说明返回了o对应的value,也就是PRESENT
* false,删除失败,说明返回了null,也就是比较地址失败
*/
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
/**
* 调用HashMap的size()方法,返回HashMap中键值对的数量,也就是集合中元素的数量
*/
public int size() {
return map.size();
}
/**
* 调用HashMap的isEmpty()方法,判断HashMap中是否包含任何键值对
* true,说明集合中不包含任何元素
* false,说明集合中包含元素
*/
public boolean isEmpty() {
return map.isEmpty();
}
/**
* 调用HashMap的containsKey()方法来判断map中是否包含指定的Key,即是否包含元素o
* true,说明存在与o相等的Key
* false,说明没有相等的Key
*/
public boolean contains(Object o) {
return map.containsKey(o);
}
/**
* 调用底层HashMap的keySet()方法来获取HashMap中所有Key的集合,也就是HashSet
* 返回一个Iterator对象,用于遍历集合中的元素
* 使用 hasNext() 和 next() 方法按顺序遍历集合中的元素
*/
public Iterator<E> iterator() {
return map.keySet().iterator();
}