ArrayList 与 LinkedList 的区别
1.底层数据结构不同:ArrayList 的底层是基于数组来实现的,而 LinkedList 底层是基于链表实现的;(可以理解为 ArrayList 与 LinkedList 的区别实际上就是数组和链表的区别)
2.适用场景不同:ArrayList 更适合于使用随机查找较多的场景,LinkedList 更适合于使用随机插入较多的场景;
3.查询、插入、删除的时间复杂度不同:由于 ArrayList 是基于索引的数据接口,它的底层是基于数组的,可以随机读取,所以其查询的时间复杂度为,而插入和删除的时间复杂度为
;LinkedList 是以元素列表的形式存储数据的,每一个元素和它的前一个元素和后一个元素连接在一起,它的底层是基于链表的,所以其查询的时间复杂度为
,插入和删除的时间复杂度为
;
4.ArrayList 实现了 List 接口,LinkedList 也实现了 List 接口,除此之外,LinkedList 还实现了 Deque 接口,所以 LinkedList 还可以当作队列来用;
5.LinkedList 比 ArrayList 更占内存,因为 LinkedList 为每一个节点存储了两个引用,一个指向前一个元素,一个指向后一个元素。
ArrayList
ArrayList 的内部结构其实就是数组(一块连续的存储空间)。实现了 List 接口。
当我们创建一个空的 ArrayList 时,它会使用默认容量(当前为 10)初始化其后备数组,在该数组未满时,其添加操作是非常快的,但是随着其后备数组容量的增加,添加操作之前可能还需进行一次扩容操作,扩容机制是将原数组的内存空间长度扩容至原来的 1.5 倍。
通常,当需要 List 实现时,ArrayList 是许多开发人员的默认选择。事实上,当读取次数远远超过写入次数时,这是一个非常明智的选择。
LinkedList
LinkedList 的内部结构其实是一个双向链表(不连续的存储空间)。实现了 List 和 Deque 接口。
链表的每个节点是一个 Node,节点中有 3 个属性:
-
item : 实际存放的内容;
-
prev : 指向前一节点的指针;
-
next : 指向后一节点的指针。
当添加率远高于读取率时,LinkedList 更适合。 此外,当大多数时候我们想要第一个或最后一个元素时,它可以用于读取密集的场景。值得一提的是,LinkedList 还实现了 Deque 接口——支持对集合两端的高效访问。