是一个动态数组,会基于数组做自动扩容
可以存储有序的、可重复的数据
实现类
ArrayList实现类,开发中主要使用;线程不安全的,效率高;底层使用Object数组存储
在添加数据、查询数据时效率较高,在插入、删除数据时效率较低
LinkedList实现类,底层使用双向链表的方式进行存储,在对集合中的数据进行频繁的删除、插入时,建议使用此类
在添加数据、查询数据时效率较低,在插入、删除数据时效率较高
双向链表
每一个元素都两个指针,分别指向上一个、下一个元素的位置
插入、删除时只需要将元素的上一个、下一个指针指向做更改即可
Vector实现类,List古老的实现类,线程安全的,效率低;底层使用Object数组存储
方法
void add(int index, Object ele) // 在index位置插入ele元素
boolean addAll(int index, Collection eles) // 从index位置开始将eles中的所有元素添加进来
Object get(int index) // 获取指定index位置的元素
List subList(int fromIndex, int toIndex) // 返回从fromIndex到toIndex位置的子集合
int indexOf(Object obj) // 返回obj在集合中首次出现的位置
int lastIndexOf(Object obj) // 返回obj在集合中最后一次出现的位置
Object remove(int index) // 移除指定index位置的元素,并返回此元素
Object set(int index, Object ele) // 设置指定index位置的元素为ele
ArrayList源码
JDK7
底层会初始化数组,数组的长度为10,Object[] elementData = new Object[10];
当要添加第十一个元素的时候,底层的elemendData数组已满,则需要扩容,默认扩容为原来长度的1.5倍,并将原有数组中的元素复制到新数组中
JDK8
底层会初始化数组,Object[] elementData = new Object[]{};
首次添加元素时,会初始化数组 elementData = new Object[10]; 并将数据插入到数组中
如果首次添加的元素数量超过10个,那么将使用实际的元素数量初始化数组
当要添加第十一个元素的时候,底层的elemendData数组已满,则需要扩容,默认扩容为原来长度的1.5倍,并将原有数组中的元素复制到新数组中
Vertor源码
JDK8
底层会初始化数组,数组的长度为10,Object[] elementData = new Object[10];
当要添加第十一个元素的时候,底层的elemendData数组已满,则需要扩容,默认扩容为原来长度的2倍,并将原有数组中的元素复制到新数组中
LinkedList源码
JDK8
首次添加元素时,将元素封装到一个Node对象中,list对象的属性first、last都指向此Node对象
添加第二个元素时,元素1的对象与元素2的对象构成一个双向链条,同时list对象的属性last指向第二个元素的Node对象
说明
ArrayList底层使用数组结构,查找和添加(尾部添加)操作效率高,时间复杂度o(1)
删除和插入操作效率低,时间复杂度o(n)
可以指定初始数组长度
LinkedList底层使用双向链表结构,删除和插入操作效率高,时间复杂度o(1)
查找和添加(尾部添加)操作效率低,时间复杂度o(n),有可能添加操作时间复杂度是o(1)