JAVA 底层 (二) ArrayList和LinkList

一、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

  

猜你喜欢

转载自blog.csdn.net/qq_37203082/article/details/112652424