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)
