一、ArrayList
ArrayList 底层的数组结构一个数组如下图
初始创建一个空的数组,添加一个元素后,大小变为10,扩容 按照1.5倍数自动扩容
继承抽象类 abstractList<E> 重写get() add() 等方法
接口
List<E> 提供Lits 常用方法
RadomAccess 一个标记接口,使使用该接口的类支持 快速随机访问
Cloneable提供克隆方法
Serializable 提供序列化标识 (作用于流操作)
优点:查询快,get方法使用 配置了 快速随机访问,故而查询快。
缺点:增删慢,删除操作需要对整个数组 再做移动,所以慢。还有扩容操作也导致慢。
线程安全问题:ArrayList 线程不安全,可用Vetor代替
时间复杂度
get() 直接读取第几个下标,复杂度 O(1)
add(E) 添加元素,直接在后面添加,复杂度O(1)
add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n)
remove()删除元素,后面的元素需要逐个移动,复杂度O(n)
总结:查 O(1) 增 末尾0(1)中间0(n) 删0(n)
二、LinkList
LinkList 底层的数组结构一个 双向的循环链表,每个元素的头部和尾部存放着指向 如下图
初始化创建,没有大小,也不会扩容
继承 AbstractSqeuentialList 支持迭代器按顺序 访问 ,没有实现RadomAccess 所以随机访问不快
List 接口,能对它进行队列操作。
Deque 接口,即能将LinkedList当作双端队列使用。
Cloneable接口,即覆盖了函数clone(),能克隆。
Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
优点:增删快,因为执行插入删除操作时,只需要操作引用即可,元素不需要移动元素,他们分布在内存的不同地方,通过引用来互相关联起来
缺点:就是没ArrayList查询快(不算缺点吧)
线程安全问题:不安全。
方法1:List list = Collections.synchronizedList(new LinkedList());
方法2:将LinkedList全部换成ConcurrentLinkedQueue
时间复杂度
get() 获取第几个元素,依次遍历,复杂度O(n)
add(E) 添加到末尾,复杂度O(1)
add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n)
remove()删除元素,直接指针指向操作,复杂度O(1)
三、总结
初始大小 | 扩容 | 继承 | 实现 | 优点 | 缺点 | 线程安全 | |
ArrayList | 0-》10 | 1.5 | abstractList | List、RadomAccess、Cloneable 、Serializable | 查询快 | 增删慢 | 不安全,换Vetor |
LinkList | 没有 | 不会扩容 | AbstractSqeuentialList | List 、Deque、Cloneable、Serializable | 增删快 | 没ArrayList快 | 不安全,1、List list = Collections.synchronizedList(new LinkedList()); 2、ConcurrentLinkedQueue |