【发布时间】:2021-02-27 01:21:01
【问题描述】:
我遇到了this 问题,第一个(已接受)答案说这部分:
ArrayDeque 没有节点分配的开销 LinkedList 没有向左移动数组内容的开销 删除 ArrayList 所具有的。
我同意节点开销,但不同意关于移动元素的部分。我知道 StackOverflow 也可能有错误的信息,但是这个答案有很多票,所以一定是我的无知。谁能告诉我:
为什么ArrayDeque 没有移动元素的开销? ArrayDeque(正如其名称所述)仍然使用 ARRAY。这意味着它与任何其他 array 的工作方式相同。如果我有 10 个元素并且我删除了 head,那么这 9 个元素必须向左移动 1 个位置。这是LinkedList 没有的开销——它只是更改了对prev 和next 的引用。我说的对吗?
总而言之,ArrayList 和 ArrayDeque 的工作方式不一样吗?如果结构发生变化,它们都会转移元素。唯一的区别是ArrayList 可以访问任何任意位置,而ArrayDeque 作为FIFO/LIFO 工作。如果我错了,有人可以纠正我吗?我不想在这里学错。
【问题讨论】:
-
我会说,你是对的。但他们只查看了结构头部的队列操作,无论是在帖子中还是在基准测试中。刚刚看了一下,ArrayDequeue 也有例如
delete(i)进行所有轮班工作,其方式与 ArrayList (System.arrayCopy) 相同。 -
仅仅看一个队列一侧的操作,怎么会有人发表这样的评论呢?我只是不明白这个答案在半真半假时得到了多少票。还是真的。
-
好吧,那是 OP 的问题,很公平。但尤其是这种链表/数组列表的讨论会一直持续下去,你可以找到长达数小时的讨论,将它们的细节剖析到对硬件级别的影响等等。
-
在删除第一个元素时
ArrayDequeue不必移动其余元素,因为ArrayDequeue有一个字段用于第一个元素的位置 (head)。删除第一个元素基本上转换为head++(如果之后head的值与内部数组的长度相同,则需要一些额外的逻辑)
标签: java arrays arraylist queue arraydeque