一、原理
1、HashSet
hashset底层其实维护的是一个HashMap实例。底层数据结构是哈希表。综合了数组和链表的优点。其有以下等特点:
(1) 不允许存放重复值的集合(通过hashCode()函数及equals()函数来判断是否重复)。
(2)不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也可能发生变化 (内部维护的是hashmap,采用hash取模确定数组索引位置,然后在存入链表)。
(3) HashSet是非线程安全的。
(4) 集合元素值可以是nul。
/**
* 维护的hashMap实例
*/
private transient HashMap<E,Object> map;
/**
* 无参构造器,创建一个hashMap实例,默认的加载因子是0.75
*/
public HashSet() {
map = new HashMap<>();
}
/**
* 包含指定集合的构造函数
*/
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
/**
* 指定初始容量及加载因子的构造函数
*/
public HashSet(int initialCapacity, float loadFactor) {
ma