java基础-集合框架Collection子接口List

2024-04-03

是一个动态数组,会基于数组做自动扩容

可以存储有序的、可重复的数据

实现类

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)


{/if}