Java ArrayList 和 LinkedList - 在结束实现细节中添加元素



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

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

而链表,它们是存储对列表中最后一个节点的引用,还是遍历整个列表以到达末尾?

查看源代码:

数组列表:

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

链接列表:

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此字段将递增,然后直接寻址到内部数组中的该元素。

相关内容

  • 没有找到相关文章

最新更新