1.四大类容器
java中容器主要有四大类,如下图所示
2.非并发容器
1) List 类
List 类 不支持并发的有 ArrayList 与 LinkedList
ArrayList
底层实现
ArrayList 底层为 数组,由于数组的特性,非常适合用于 查询多,增删改的业务场景
实例化时创建了一个Object类型的数组(Java泛型只存在于编译时期)
扩容
ArrayList 底层为数组,数组一但初始化无法扩容,所以ArrayList底层扩容是通过创建一个新的数组,再将原有数组的数据拷贝过去,拷贝数据底层用的是 System.arraycopy。新数组的大小 = 原有数组的大小 + 原有数组的大小右移一位 近似1.5倍。
创建新的数组后使用 System.arraycopy 数据拷贝
LinkedList
底层实现
LinkedList 底层实现为双向链表,由一个个Node串联起来 ,适合 增删多,查找少的场景(每次查找都需要从头开始遍历,直到找到目标为止)
Node 的三个参数 : 元素,前指针,后指针
扩容
LinkedList 不存在扩容这么一说,如果说LinkedList的上限,那么就是int类型的上限。新增元素时,创建一个新的Node节点,将新节点的prev指针 指向上一个节点,同时将上一个节点的 next指针 指向 新的Node节点
2)Set 类
HashSet
底层实现
HashSet 底层基于HashMap,HashMap 为 k-v 键值对类型,而HashSet 的 value 为 固定值 PRESENT (Object)
扩容
由于HashSet 是在HashMap的基础上实现的,底层对元素的增删改都是对 引用的 HashMap 进行操作,因此扩容机制与HashMap一致
去重
Set 类的集合不能有重复元素,HashSet通过Hash表去重
TreeSet
底层实现
TreeSet 底层维护了 一个 TreeMap,通过Map的 key 来存储元素
扩容
由于TreeSet 是在TreeMap的基础上实现的,底层对元素的增删改都是对 引用的 TreeMap进行操作,因此扩容机制与TreeMap一致