一、ArrayList
1、ArrayList集合底层采用的是数组
2、ArrayList集合默认初始化容量10,数组扩容到原容量的1.5倍
在使用ArrayList时最好提前估计一下元素的数量,给定一个初始化容量,因为数据较少时ArrayList末尾会预留一定的空间,浪费内存;而当数据较多的时候数组会扩容,扩容效率比较低
3、ArrayList集合通过下标搜索数据,时间复杂度是O(1),所以检索效率比较高
4、ArrayList随机增删元素效率较低,因为增删以后会对操作之后所有元素的下标索引产生影响,需要进行元素的移动。但是呢,在数组末尾添加或者删除元素,时间复杂度为O(1),效率还是很高的。
当数组装满的时候还要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n)。
6、Arraylist是非线程安全的
二、LinkedList
1、LinkedList集合底层采用了双向链表
2、随机增删效率较高,LinkedList中插入或删除的时间复杂度仅为O(1)。
3、检索效率较低,因为LinkedList需要在双向列表中移动指针从前往后依次查找,直到找到index的位置,再返回 。
三、
1、LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。
2、ArrayList的插入,删除操作也不一定比LinkedList慢,如果在List靠近末尾的地方插入,那么ArrayList只需要移动较少的数据,而LinkedList则需要一直查找到列表尾部,反而耗费较多时间,这时ArrayList就比LinkedList要快。
3、时间复杂度
操作 | 数组 | 链表 |
---|---|---|
随机访问 | O(1) | O(N) |
头部插入 | O(N) | O(1) |
头部删除 | O(N) | O(1) |
尾部插入 | O(1) | O(1) |
尾部删除 | O(1) | O(1) |