1. 引言
HashSet 实现了 Set 接口,底层的数据结构是一个 哈希表
(实际上是一个 HashMap 实例),所以,要了解 HashSet,最主要的还是要了解 HashMap,有关 HashMap 源码分析可以看 这篇文章。HashSet 主要有以下特点:
- 因为底层的数据结构是 HashMap,所以允许 null 值的存在。
- 因为底层的 HashMap 会重新构造 hash table 的大小,因此并不能保证迭代的顺序和存储顺序一致。
- HashSet 所有的元素存在 HashMap 的 key 中,对应的 value 是一个静态变量
private static final Object PRESENT = new Object()
,因为 HashMap 中 key 是唯一的,因此 HashSet 不允许存在重复值。 - 它并不是同步的,JDK 提供了这样的方法可以创建出一个同步的 HashSet:
Set set = Collections.synchronizedSet(new HashSet())
- iterator 方法返回的是迭代器是
fail-fast
,在创建了迭代器之后如果对该 HashSet 进行修改的话(除非是代用迭代器自己的 remove 方法),将会抛出 ConcurrentModificationException。
2. 常规操作
HashSet 的增删改等操作都是调用 hashMap 来完成的,因此不再做过多的分析
public Iterator<E> iterator() {
return map.keySet().iterator();
}
public int size() {
return map.size();
}
public boolean isEmpty() {
return map.isEmpty();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
。。。