1、HashSet介绍
与HashMap类似,字面上看,HashSet由两个单词组成:
Hash
和Set
。其中,Set
表示接口,实现Set
接口也有多种方式,各有特点,HashSet实现的方式利用了HashSet
public interface Set<E> extends Collection<E> {
表示容器
没有重复元素、且不保证顺序
的容器接口,它扩展了Collection
,但没有定义任何新的方法、
无顺序,不重复
与`HashMap类似,HashSet要求元素重写hashCode和equals方法,且对于两个对象,如果equals相同,则hashCode也必须相同,如果是自定义的类,需要注意这一点
HashSet的应用场景
- 排重
- 保存特殊值
- 集合运算
底层就是一个HashMap
2、构造函数
HashSet的内部是用HashMap实现的,它内部有一个HashMap实例变量
同时,这个HashMap所有键对应的值固定
//HashSet内部使用HashMap实现,它的内部有一个HashMap实例变量
private transient HashMap<E,Object> map;
//Map有键和值,HashSet相当于只有键,都是相同的固定值,
private static final Object PRESENT = new Object();
HashSet的构造方法,主要就是调用了对应的HashMap的构造方法
2.1、HashSet
public HashSet() {
map = new HashMap<>();
}
2.2public HashSet(int initialCapacity, float loadFactor) {
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
2.3、public HashSet(int initialCapacity) {
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
2.4、 public HashSet(Collection<? extends E> c) {
public HashSet(Collection<? extends E> c) {
// c.size()/0.75用于计算initialCapacity,0.75f是loadFactor的默认值
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
//添加元素
addAll(c);
}
3、add方法
public boolean add(E e) {
//就是map调用的put元素,元素e用于键,值就是固定的PRESENT,
// put返回null表示原来没有对应的键,添加成功了。
return map.put(e, PRESENT)==null;
}
4、remove方法
public boolean remove(Object o) {
//就是调用map的remove方法,返回值为PRESENT表示原来有对应的键且删除成功
return map.remove(o)==PRESENT;
}
5、contains
public boolean contains(Object o) {
//就是检查map中是否包含对应的键
return map.containsKey(o);
}