基本介绍:

  1. HashSet实现了Set接口
  2. HashSet实际上是HashMap

image.png

  1. 可以存放null,只能放一个
  2. HashSet不保证元素是有序的,取决于hash()后,再确定索引结果
  3. 不能有重复元素/对象

HashSet底层机制说明

  1. HashSet底层是HashMap
  2. 添加一个元素时,对元素的哈希值(hashCode方法)进行运算(源码hash方法),得出索引值,即数组+链表+红黑树结构中的数组索引
  3. 如果索引位置没有元素则直接存放;如果有,则调用equals方法比较,如果相等就不添加,如果不相等,则添加在最后
  4. 在Java8中,如果一条链表的元素个数到达TREEIFY_THRESHOLD(默认8),并且table的大小>=MIN_TREEIFY_CAPACITY(默认64),就会进行树化(红黑树)

image.png
image.png

HashSet扩容机制

  1. HashSet底层是HashMap,第一次添加时,table数组扩容到16,临界值(threshold)是 16*加载因子(loadFactor为0.75) = 12
  2. 如果table数组使用到了临界值12,就会扩容到162=32,新的临界值就是320.75=24,依次类推
  3. 在Java8中如果一条链表的元素个数到达TREEIFY_THRESHOLD(默认是8)并且table的大小>=MIN _TREEIFY_CAPACITY(默认64),就会进行树化(红黑树),否则仍然采用数组扩容机制