该类ArrayList
是数组的包装类。它包含一个内部数组。
public ArrayList<T> {
private Object[] array;
private int size;
}
ALinkedList
是链表的包装类,具有用于管理数据的内部节点。
public LinkedList<T> {
class Node<T> {
T data;
Node next;
Node prev;
}
private Node<T> first;
private Node<T> last;
private int size;
}
请注意,当前代码用于显示类的可能方式,而不是实际的实现。知道了实现可能如何,我们可以做进一步的分析:
如果我随机访问它的元素,ArrayList 比 LinkedList 快。我认为随机访问意味着“给我第 n 个元素”。为什么 ArrayList 更快?
ArrayList 的访问时间:O(1)。LinkedList 的访问时间:O(n)。
在数组中,您可以使用 访问任何元素array[index]
,而在链表中,您必须从开始浏览所有列表,first
直到获得所需的元素。
LinkedList 的删除速度比 ArrayList 快。我理解这一点。ArrayList 的速度较慢,因为需要重新分配内部备份数组。
ArrayList 的删除时间:访问时间 + O(n)。LinkedList 的删除时间:访问时间 + O(1)。
ArrayList 必须将所有元素从要删除的项目移动array[index]
到开始的索引。array[index-1]
LinkedList 应该导航到该项目,然后通过将其与列表分离来删除该节点。
LinkedList 的删除速度比 ArrayList 快。我理解这一点。ArrayList 的速度较慢,因为需要重新分配内部备份数组。
ArrayList 的插入时间:O(n)。LinkedList 的插入时间:O(1)。
为什么 ArrayList 可以取 O(n)?因为当你插入一个新元素并且数组已满时,你需要创建一个更大的新数组(你可以用像 2 * size 或 3 * size / 2 这样的公式来计算新的大小)。LinkedList 只是在最后一个节点旁边添加一个新节点。
这种分析不仅在 Java 中,而且在 C、C++ 和 C# 等其他编程语言中。
更多信息在这里: