当前位置: 首页 > 知识库问答 >
问题:

当插入和删除列表中间时,LIKEDLIST比ARARYLIST快。只是“在中间”?

谷梁星雨
2023-03-14

好吧,关于LinkedList和ArrayList有很多讨论,但当我在《用Java思考》中看到这个描述时,我仍然感到困惑:

LIKEDList还实现了基本的列表接口,如ARARYLIST DO,但是它比ARARYList更有效地执行某些操作(列表中的插入和删除)。

我不知道为什么它强调“在列表的中间”,我想在列表的开头插入时,ArrayList也需要转移后面的元素,而且它比LinkedList快吗?

共有3个答案

祁杰
2023-03-14

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

ArrayList。爪哇:

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;
}
劳华灿
2023-03-14

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

还应该注意的是,虽然经典的LIKEDLIST会在中间插入,但是ArayLIST也会经常执行,或者比链接列表更好(这实际上是在不止一种语言之间常见的,包括C(Bjarne Stroustrup实际上有一个关于概念的讲座))。你应该仔细考虑你在做什么,并用基准来做出正确的决定。

轩辕煌
2023-03-14

之前的答案很好,但这些帮助我想象发生了什么,以及何时需要更详细的解释:

删除

插入

 类似资料:
  • 在Java上下文中说话。如果我想在或中间插入,我被告知将执行得很糟糕。 我理解这是因为,我们需要移动所有元素,然后进行插入。其顺序应为n/2,即O(n)。 但是不也是这样吗。对于链表,我们需要遍历到找到中间位置,然后进行指针操作。在这种情况下,也需要O(n)时间。不是吗? 谢啦

  • 问题内容: 当使用“ ALTER TABLE tab ADD col”时,新列将添加到表的末尾。例如: 桌子会变成 但是,正如我的示例列的命名所暗示的那样,我实际上希望表最终像这样: 在COL_4之前使用COL_3。 除了从头开始重建表之外,是否还有任何标准的SQL可以完成工作?但是,如果没有标准的SQL,我仍然可以使用一些与供应商相关的Oracle解决方案,但是最好还是使用标准解决方案。 谢谢。

  • 问题内容: 我已经写了下面的代码,但它似乎只插入当前日期,而不是当前时间。有人知道该怎么做吗? 问题答案: 似乎只是因为这就是它要打印的内容。但是实际上,您不应该以这种方式编写逻辑。这等效于: 将系统日期转换为字符串,只是将其转换回日期,似乎很愚蠢。 如果要查看完整日期,则可以执行以下操作:

  • 问题内容: 假设我们已经有一个指向该节点的指针,则在列表的特定点插入或删除元素是恒定时间操作。-来自链接列表上的Wikipedia文章 单个链表中的链表遍历始终从头开始。我们必须继续努力直到满足给定条件。 因此,除非我们处理头节点,否则这将使任何操作都变得最糟O(n)。 我们不能直接链接列表中的给定指针。那么为什么说这是一个恒定时间的操作呢? 编辑:即使我们有一个指向该节点的指针,我们也必须从头开

  • 根据文档,Time似乎是一个有效的列类型。 https://docs.aws.amazon.com/redshift/latest/dg/r_datetime_types.html#r_datetime_types-time https://docs.aws.amazon.com/redshift/latest/dg/c_supported_data_types.html 但是,当我尝试执行插入时

  • 这是保存列表的功能,有什么方法可以让我将列表保存在数据库中,并跳过现有的列表,这样它就会与现有的列表重复。 下面是我保存列表的SQL