HashSet的全面说明

  1. HashSet实现了Set接口
  2. HashSet实际上是HashMap
  3. 可以存放null,但只能存一个
  4. HashSet不保证元素有序,取决于Hash否,再确定索引的结果
  5. 不能由存放元素/对象,在前面Set接口使用已经写过

HashSet底层机制说明

  1. HashSet底层是HashMap
  2. 添加一个元素时,先得到hash值,会转成→索引值
  3. 找到存储数据表table,看这个索引位置是否以及存放的有元素
  4. 如果没有,直接加入
  5. 如果有,调用equals比较,如果血糖,就放弃添加,如果不同,则加到最后
  6. 在java8中,如果一条链表的元素个数超过TREEIEY_THREHOLD(默认是8),并且table的大小≥MIN_TREEIFY_CAPACITY(默认64),就会进行树话(红黑树)

HashSet扩容机制

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