HashSet的全面说明
- HashSet实现了Set接口
- HashSet实际上是HashMap
- 可以存放null,但只能存一个
- HashSet不保证元素有序,取决于Hash否,再确定索引的结果
- 不能由存放元素/对象,在前面Set接口使用已经写过
HashSet底层机制说明
- 分析HashSet底层是HashMap,HashMap底层是(数组+链表+红黑树)
- HashSet底层是HashMap
- 添加一个元素时,先得到hash值,会转成→索引值
- 找到存储数据表table,看这个索引位置是否以及存放的有元素
- 如果没有,直接加入
- 如果有,调用equals比较,如果血糖,就放弃添加,如果不同,则加到最后
- 在java8中,如果一条链表的元素个数超过TREEIEY_THREHOLD(默认是8),并且table的大小≥MIN_TREEIFY_CAPACITY(默认64),就会进行树话(红黑树)
HashSet扩容机制
- HashSet底层是HashMap,第一次添加时,table数组扩容到16,临界值(threshold)是16*加载因子(loadFactor)是0.75 =12
- 如果table数组使用临界值12,就会扩容到162=32,新的临界值就是320.75=24,以此类推
- 在java8中,如果一条链表的元素个数超过TREEIEY_THREHOLD(默认是8),并且table的大小≥MIN_TREEIFY_CAPACITY(默认64),就会进行树话(红黑树),否则仍然采用数组扩容机制