一、ArrayList
1.ArrayList默认开辟10个大小的空间;
2.底层由数组实现;
3.当ArrayList容量不足的时候会自动进行扩容,每次以1.5倍的速度扩容
JDK 1.6 int newCapacity = oldCapacity + (oldCapacity >> 1);
JDK 1.8 int newCapacity = oldCapacity*3/2+1;
4.支持向后遍历的迭代器
二、LinkedList
1.底层是双向循环链表;
2.LinkedList提供双向迭代器;
3.LinkedList 是基于链表的,不需要扩容机制;
4.
getFirst peekFirst
getLast peekLast
removeFirst pollFirst
removeLast pollLast
addFirst offerFirst
addLast offerLast
操作失败,抛出异常 操作失败,返回null
5.队尾入 add offer
队头出 remove poll
查看队头元素 element peek
三、区别
1.ArrayList适用于随机访问(get(index)),读取速度快,时间复杂度为O(1);LinkedList适用于顺序访问;
2.LinkedList进行插入、删除操作方便,时间复杂度为O(1);而ArrayList在非尾部进行插入、删除操作时开销较大,因为会引起大量数据元素的移动,时间复杂度高;
3.在ArrayList中,任意两个在逻辑上相邻的元素在物理上也相邻;而LinkedList中,每当有新的元素需要存储时用户才向系统动态申请所需的存储空间插入链中,这些在不同时刻向系统动态申请的存储空间在内存中很可能地址不连续,因此,任意两个在逻辑上相邻的元素在物理上不一定相邻。