Java 面试题之“Arraylist和Linkedlist的区别”

ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String或者Integer。那么ArrayList和LinkedList在性能上有什么差别呢?什么时候应该用ArrayList什么时候又该用LinkedList呢?

Arraylist:

底层是基于动态数组,根据下表随机访问数组元素的效率高,向数组尾部添加元素的效率高;但是,删除数组中的数据以及向数组中间添加数据效率低,因为需要移动数组。例如最坏的情况是删除第一个数组元素,则需要将第2至第n个数组元素各向前移动一位。而之所以称为动态数组,是因为Arraylist在数组元素超过其容量大,Arraylist可以进行扩容

Linkedlist:

基于链表的动态数组,数据添加删除效率高,只需要改变指针指向即可,但是访问数据的平均效率低,需要对链表进行遍历。
在这里插入图片描述

ArrayList和LinkedList的大致区别:

 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 

面试回答:

两者都继承了list,collection接口,但Linkedlist还继承了Queue接口
两者都是线程不安全的

扩容机制:
1.Arraylist是动态扩容机制,初始容量为10,扩容机制为1.5倍。初始最大容量为Integer.MAX_VALUE - 8,原因是防止内存溢出,增加容错率。但是实际最大容量还是可以达到Integer.MAX_VALUE

2.Linkedlist的扩容就是新建节点进行指针指向即可

增加元素:
1.Arraylist在尾部增加元素很快,时间复杂度为O(1),但是在中间增加元素需要移动大量的元素,时间复杂度为O(n)

2.Linkedlist在尾部和中间增加元素的时间复杂度都是O(1),但是在中间添加元素需要先遍历找到插入位置

删除元素机制和增加元素基本类似

查询元素
1.Arraylist中的get方法直接通过index去获取元素,时间复杂度为O(1)

2.Linkedlist中的就需要遍历链表,时间复杂度为O(n)

猜你喜欢

转载自blog.csdn.net/qq_43434328/article/details/114954159