HashSet源码解析

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;
 }
。。。

猜你喜欢

转载自blog.csdn.net/FireFox1997/article/details/81539838
今日推荐