关于数组:Java ArrayList和LinkedList – 在最终实现细节中添加元素

Java ArrayList and LinkedList - adding element at end implementation details

我对arraylist比链表更快的理解是,使用arraylist你基本上只需要一个动作 - 更新end数组元素的引用,而使用链表你必须做更多的事情,例如 创建一个新节点,更新2个引用,浏览链表并更新最后一个节点以指向新节点等。

但是我不确定java如何实现这些。 arraylist如何知道"last"元素的位置,它是存储最后一个元素的值还是遍历数组并在最后一个元素之后添加一个新元素?

和链表一样,它们是否存储了对列表中最后一个节点的引用,还是它们遍历整个列表以达到目的?


看看来源:

数组列表:

1
2
3
4
5
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

链表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public boolean add(E e) {
    linkLast(e);
    return true;
}

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

数组列表仅在某些操作中更快。如果在数组中间添加元素,则arraylist需要将所有数据基本复制到新数组中。只有当arraylist已经为新数据分配了空间时,在数据为空时(通常在最后)插入数据时才会很快。按索引读取/更新速度非常快。

LinkedList在插入时很快,因为它永远不需要复制整个数组。但访问链接列表中的数据很慢,因为您需要"遍历"所有元素,直到您找到要查找的元素。


您始终可以查看java.*类的来源。

但是,特别回答你的问题:ArrayList类中有int字段,其中包含填充内部数组区域的当前大小。在ArrayList对象中添加新值时,此字段会递增,然后直接寻址到内部数组中的该元素。