基础介绍
- 无序
- 不重复
- 无索引
继承关系
1.实现Cloneable接口
2.实现java.io.Serializable接口
3.继承AbstractSet抽象类
构造器
1.空参构造:构造一个新的空集合;后备 HashMap 实例具有默认初始容量 (16) 和负载系数 (0.75)。
public HashSet() {
map = new HashMap<>();
}
2.有参构造:传入指定数组容量
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
3.有参构造:传入指定初始容量和荷载系数
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
4.有参构造:传入一个Collection的子类,创建一个hashmap,负载系数还是0.75,容量就根据传入的子类中元素数量来判断,将元素数*0.75+1与16比较,哪个大选哪个,然后再把数据加到map中
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
总结
HashSet的底层重写代码没多少,都是调用hasnmap的方法进行实现
在数据存储的过程中,实际上是创建了一个hashmap,并将数据写入到hashmap中,该节点的key即为原数据,value则为一个底层默认创建的PRESENT,map通过hashcode保证key的不重复性,也就保证了set的不重复性。
private static final Object PRESENT = new Object();
因为没有索引,也没有get方法,若要获取hashset中的值,则需要对hashset生成迭代器对象Iterator来获取数据,因为没有那些next,before,after属性,因此数据与存入时的顺序是不一致的