目录
Set接口:
Set接口没有扩展新的功能。
set接口的遍历方式:
同Collection的遍历方式一样,因为set接口是Collection接口的子接口
1.可以使用迭代器
2.增强for
3.不能使用索引的方式来获取
常用实现类:
HashSet:无序:新增顺序和取出顺序不一定一致
(1)HashSet实现了Set接口
(2)HashSet实际上是HashMap
(3)可以存放null值,但是只能有一个null
构造方法:
public HashSet();
public HashSet(int capacity);
public HashSet(int capacity,float loadFactor);
底层数据结构:
哈希表(数组+链表/红黑树)
什么类型的数组:java.util.HashMap$Node(表示一个单项链表)
数组长度是多少:16
如何判断新增的两个元素是否重复:
比较两个对象的哈希值 && (地址值相同 || equals相同) //规则
新增过程:
a.计算新增元素的哈希值
b.(假设数组已经创建出来),通过 hash%数组长度
c.如果该位置为null:则直接新增
如果该位置不为null:
c1.判断该元素是否重复:
c11.如果不重复,则新增到该索引值位置链表的最后面
c12.如果重复:则不新增
什么情况下链表会转红黑树:
a.当同一索引值下元素个数>8,并且数组长度>=64
什么情况下会扩容:
a.当同一索引值下元素个数>8,并且数组长度<64
b.数组的索引值,占有>到0.75,会扩容
注意:同一索引值下元素不能超过8个,如果超过
1.扩容,把元素分开,让其小于8个
2.把链表结构转换成红黑树
新容量 = 旧容量<<1;
可以通过构造方法指定加载因子。
可以通过构造方法指定哈希表数组的长度:
实际的长度>=传入容量,则最近2的次方的值。
LinkedHashSet:有序
构造方法:
public LinkedHashSet();
底层数据结构:链表+哈希表
TreeSet<E>:可排序
构造方法:
public TreeSet();
public TreeSet(Comparator<E> c);
底层数据结构:红黑树