【问题标题】:LinkedList is faster than ArrayList when insertion and removal in the middle of the List. Just "in the middle"?在 List 中间插入和删除时,LinkedList 比 ArrayList 快。只是“中间”?
【发布时间】:2014-08-14 05:52:20
【问题描述】:

好吧,关于LinkedList和ArrayList的讨论很多,但是看到《Thinking in Java》中的这个描述我还是觉得一头雾水:

LinkedList 也像 ArrayList 一样实现了基本的 List 接口,但它 执行某些操作(在列表中间插入和删除)更多 比 ArrayList 更高效。

不知道为什么强调“在List中间”,我觉得ArrayList在List开头插入的时候也需要传递后面的元素,比LinkedList快?

【问题讨论】:

  • 在某些情况下,LinkedList 是更好的选择。十年来,我需要它一次。通常,如果您的列表经常更新,那么使用它是有意义的。在任何其他情况下,都没有性能提升,但总是会遭受内存损失。所以坚持使用 ArrayList,你会没事的。

标签: java arraylist linked-list


【解决方案1】:

以前的答案非常好,但这些帮助我想象正在发生的事情以及何时需要更详细的解释:

删除

插入

【讨论】:

    【解决方案2】:

    重点是暗示 ArrayList 在内部需要移动元素,并保持开放内存以供进一步插入导致它移动和复制元素。 LinkedList 将简单地创建一个节点,然后将前一个节点的next 节点设置为新节点,并将新节点的next 节点设置为列表中的下一个节点。

    还应该注意的是,虽然经典的 LinkedList 在中间插入方面表现出色,但有时 ArrayList 的性能也一样,或者比 LinkedList 更好(这实际上在不止一种语言之间很常见,包括 C++ [Bjarne Stroustrup 实际上有关于这个概念的讲座])。您应该仔细考虑自己在做什么,并使用基准来做出正确的决定。

    【讨论】:

      【解决方案3】:

      ArrayListarray 支持,而 LinkedList 由 2 个引用支持(nextprevious 即由 DoublyLinkedList 支持)。 LinkedList 更快,因为一旦调用 add(int index, E element),它就不需要复制数组并将元素向右移动一个单元格。 ArrayList 在插入中间(或索引 0 和 currentSize 之间的任何位置)时复制/移动元素,因此需要更多时间。而LinkedList 只需要更改 2 个指针/引用。

      ArrayList.java:

      public void add(int index, E element) {
      ..
      // copying elements
      System.arraycopy(elementData, index, elementData, index + 1,
                   size - index);
      ..
      }
      

      LinkedList.java

      public void add(int index, E element) {
          addBefore(element, (index==size ? header : entry(index)));
      }
      
      private Entry<E> addBefore(E e, Entry<E> entry) {
      Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
      // just changing the pointers
      newEntry.previous.next = newEntry;
      newEntry.next.previous = newEntry;
      size++;
      modCount++;
      return newEntry;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-17
        • 2013-05-24
        • 2013-10-17
        • 2019-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多