HashSet详解

110 阅读1分钟

1.HashSet的特点

  1. 存放的元素无序
  2. 底层维护的是一个哈希表
  3. 不能添加重复元素,但是可以添加null值
  4. 底层维护的是一个HashMap,只不过value值默认被同一个Object数组填充
  5. 自定义类要注意实现equals和hashCode方法
  6. 如果哈希表中某条链表的长度超过了8,并且哈希表中的元素个数达到了64,就会对数组中存放的头结点进行树化,使其转化为一颗红黑树.

2.HashSet的两种遍历方式

//第一种遍历方式
for (Integer integer : hashSet) {
    System.out.print(integer + " ");
}

//第二种遍历方式
Iterator<Integer> iterator = hashSet.iterator();
while(iterator.hasNext()) {
    System.out.print(iterator.next() + " ");
}

3.HashSet的扩容机制

  1. 使用无参构造初始化的HashSet维护的HashMap中的table数组的大小为0,第一次添加元素时,容量大小会被初始化为16,此后按照:当元素个数达到加载因子与容量大小的乘积后,进行2倍扩容
  2. 使用指定大小的构造方法初始化HashSet,初始化容量大小为仍为0,第一次添加元素时初始化容量大小为距离在构造方法中指定容量最近的且比其大的最小的2的次幂,此后按照,当元素个数达到加载因子和容量大小的乘积时,进行2倍扩容。

4.为什么说HashSet的底层维护的是一个HashMap?

这我们就要看下源码了:

image.png