ArrayList和LinkedList区别
共同点:
(1)ArrayList和LinkedList都实现了Collection接口。
(2)都是一种线性的数据结构。
(3)底层代码都是泛型。
ArrayList构造函数:
LinkedList的构造函数:
(4)都是java集合框架提供的结构。
不同点:
(1)底层结构
ArrayList:底层结构为动态类型的顺序表
LinkedList:双向不带头结点的链表
(2)创建时的默认值
ArrayList:ArrayList默认创建时大小为10;
LinkedList: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来获取下一个节点。