ArrayList和LinkedList区别

共同点:

(1)ArrayList和LinkedList都实现了Collection接口。

java ArrayList和LinkedList区别

(2)都是一种线性的数据结构。
(3)底层代码都是泛型。
ArrayList构造函数:
java ArrayList和LinkedList区别
LinkedList的构造函数:
java ArrayList和LinkedList区别(4)都是java集合框架提供的结构。

不同点:

(1)底层结构
ArrayList:底层结构为动态类型的顺序表
LinkedList:双向不带头结点的链表
(2)创建时的默认值
ArrayList:ArrayList默认创建时大小为10;
java ArrayList和LinkedList区别
LinkedList:LinkedList无参构造
java ArrayList和LinkedList区别
(3)存储的空间
ArrayList:底层存储是一段连续的空间。
LinkedList:底层存储是链式结构,空间不一定连续。

(4)插入/删除
ArrayList:由于是一段连续的空间,因此在任意位置插入/删除时,需要对ArrayList的部分元素进行移位,时间复杂度较高为O(N),不适用于大量插入删除的场景。
LinkedList:通过链表进行存储,插入/删除时不需要搬移元素,只用改变链表节点的指向即可。因此任意位置的插入/删除速度较快,时间复杂度为O(1),适用于大量插入删除的场景。

(5)任意位置访问速度
ArrayList:底层是连续的存储空间,因此可以通过直接访问,不需要遍历,访问的时间复杂度为O(1),适用于需要大量随机访问的场景。
LinkedList:底层空间不一定连续,因此在访问特定位置的元素时,必须要进行遍历,时间复杂度为O(N)。

(6)空间是否扩容
ArrayList:由于底层是连续的,因此在插入期间,如果ArrayList的大小不允许再插入元素,则需要进行扩容。
LinkedList:底层是链式结构,不需要进行扩容,直接改变对应节点指向即可。

(7)空间利用率
ArrayList:ArrayList底层是数组,因此不需要像LinkedList开辟一个单独的指向区域用于标明下一个元素位置,ArrayList的扩容机制是每次扩容为原来的1.5倍,如果在新扩容的区域仅存储一位时,则其空间利用率不高。
LinkedList:LinkedList底层为链表,它除了存储元素本身以外,还需要再开辟空间进行指向,但LinkedList的特性是不用扩容,每增加一个元素就对应增加一个节点,因此在LinkedList中一般不会有空结点。

(8)使用场景
ArrayList:适用于将元素存储起来,需要进行大量的访问操作的场景。
LinkedList:适用于需要进行大量任意位置插入/删除操作的场景。

(9)迭代器的实现方式(以++举例)
ArrayList:获取下一个节点的方式,只需要将遍历数组的索引i++。
LinkedList:通过指针域next来获取下一个节点。

相关文章: