tips
- HashSet是依赖于HashMap的一种Set接口的实现。不能保证在对set进行迭代时的顺序,不能保证随着时间变化顺序保持不变。
- 该实现允许null。HashSet对基础操作add、remove、contains、size提供常数级的性能。迭代时花费的时间与size成比例,所以在初始化容量时,不要将初始化大小设置太高或者将负载因子设置太低。
- 当再多线程场景下使用时,建议在创建对象时使用以下方法:
Set s = Collections.synchronizedSet(new HashSet(...));
- hashSet返回的迭代器都是fail-fast(快速失败)的。在迭代过程中除了使用迭代器自身的remove方法,均会抛出异常ConcurrentModificationException
构造方法
hashSet一共提供5种构造方法
- 无参构造
public HashSet() { map = new HashMap<>();}
- 传入集合
// 参数集合c为空时会报NullPointerException
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
- 定义hashMap的初始化大小
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
- 定义hashMap的初始化大小和负载因子
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
- 使用linkedHashMap
// dummy:哑值
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
迭代器
迭代器元素其实就是hashSet内置的map的键
public Iterator<E> iterator() {return map.keySet().iterator();}
方法
hashSet提供了一些基础的操作,其实就是沿用的内置map的方法。
- size()
- isEmpty()
- contains()
- add()
- remove()
- clear()
- clone() :返回一个hashset的浅拷贝,只有实例引用没有元素。
- spliterator() : 分割迭代器