基本介绍:
1)无序、没有索引
2)不允许有重复元素,所以最多包含一个null
HashSet:
1)HashSet实际上是HashMap(底层是数组+链表+红黑树),在调用构造器时,实际上创建了一个HashMap对象,然后将HashMap中的key作为HashSet中的元素
2)向HashSet中添加元素时步骤:
a)计算元素的hash值,并将其转换为索引值
b)根据索引值查找table中该索引位置是否有元素
c)如果没有,直接加入,如果有则通过equals方法比较,如果相同则添加失败,如果不同则添加到最后
d)在Java 8中,如果一条链表的元素个数大于等于8,首先会对table进行扩容,如果扩容之后table大小大于等于64,就会进行树化(转成红黑树)
3)HashMap的扩容机制:
a)第一次添加时,table初始化大小为16,加载因子为0.75,临界值是table大小乘加载因子
b)当添加的元素个数到了临界值12时,就会扩容2倍,以此类推
c)或者当某个索引位置的链表长度达到8时,table也会扩容2倍,当table达到64时,就会进行树化
LinkedhashSet:
1)LinkedHashSet是HashSet的子类
2)底层维护的是一个LinkedHashMap,它维护了一个数组+双向链表
3)LinkedHashSet加入顺序和取出顺序相同
4)扩容机制与HashSet相同