collection接口
collection接口继承了Iterable接口因此可以使用迭代器遍历
1. List接口(列表)
特点:
- 元素有序、可重复
- 每个元素都有对应的顺序索引,支持索引取出
实现类:
1.ArrayList
- 底层:数组
- 线程不安全
底层:
底层维护了一个transient Object[] elementData数组
扩容机制:
1、无参构造器创建对象,初始elementData容量为10,扩容1.5倍
2、指定大小构造器创建大小,初始容量为指定大小,扩容1.5倍
2.LinkedList
- 底层:双向链表
- 可添加任意元素,可重复,可添加null
- 线程不安全的
底层:
双向链表 Node节点(pre,element,next)
3.Vector
- 底层:数组(Object[])
- 线程安全的(Vector的操作方法带有synchronized)
底层:
底层维护了一个Protected Object[] elementData数组
扩容机制:
无参构造器创建对象,初始elementData容量为10,扩容2倍
指定大小构造器创建大小,初始容量为指定大小,扩容2倍
2.Set接口(集合)
1.HashSet
- 无序,没有索引
- 不可以重复,只能有一个null
HashSet
- 底层:哈希表(数组 + 链表),HashSet底层通过HashMap实现
- 无序,不重复
- 允许null元素(1.8以后)
LinkedHashSet
- 底层:哈希表(数组 + 链表) + 双向链表
- 有序、不重复
底层:
hash表 + 双向链表
hash表存储的是LinkendHashMapEntry类型的节点该节点继承了HashMapNode,增加了before和after来完成有序的其他和HashMap一样
添加元素时,求hash值,再求索引,然后在哈希表中查找到对应的双向链表 有则不添加,没有则添加到该双向链表的尾部
2.TreeSet
- 底层:红黑树
- 有序、不重复
底层:
- TreeSet 内部维护了一个红黑树,根据元素的值进行排序。
- 当添加元素到 TreeSet 中时,根据元素的值的大小将其插入到红黑树中适当的位置。
- 插入操作通过比较元素的值来确定元素的插入位置,并保持红黑树的平衡性。
- 在红黑树中,每个节点存储了一个元素,并引用了两个子节点、父节点,以及额外的颜色信息(红色或黑色)。
- 通过红黑树的结构和节点之间的链接关系,TreeSet 可以高效地进行元素的查找、插入、删除和遍历操作。
- TreeSet 中的元素是有序的,根据元素的自然顺序或使用 Comparator 接口来定义的比较器来进行排序。
Map接口(K-V)
- Key-Value(键值对)
- key的唯一性,Value可重复
- 无序
实现类
1.HashMap
- 底层:数组 + 单向链表 + 红黑树
- 线程不安全
底层:
- 添加元素、进行hash运算得到索引值
- 查看哈希表中有没有该元素
- 没有直接加入(创建节点Node(key,value,next,hash,.....))
- 存在元素使用equasl方法(可以自定义重写)比较链表每个元素,相同放弃,不同则添加到链表后
扩容机制:
第一次16,当元素达到16*0.75(负载因子loadFactor = 0.75)个时进行扩容,扩容为原来的2倍,并将元素重新分配到新数组
当表的链表超过八个
先判断表容量<64,表扩容
表容量>=64,将链表转换为红黑树(JDK8)
2.LinkedHashMap
- 底层是:哈希表(数组 + 链表) + 双向链表
- 线程不安全
- HashMap的有序版
3.Hashtable
- 底层是:数组(Entry table[]) + 链表
- 键值不能为null
- 线程安全的(synchronized)
底层:
根据Key得到hash值,计算得到再table[]的索引
封装成Entry放入table[]表中
扩容机制:
初始大小为11,加载因子(0.75)
扩容11*2+1
4.TreeMap
- 底层:红黑树
- 键值不能为null
- 线程不安全的
底层:
- 初始时,创建一个空的红黑树。
- 当向 TreeMap 中添加键值对时,首先根据键进行比较找到插入位置。
- 如果红黑树为空,则直接将该键值对作为根节点插入红黑树。
- 如果红黑树不为空,则按照以下规则进行插入:
如果键小于当前节点的键,则继续在左子树中插入。 如果键大于当前节点的键,则继续在右子树中插入。 如果键等于当前节点的键,则更新当前节点的值。
插入完成后,根据红黑树的性质进行平衡操作,以确保树的平衡性和性能。