0

我试着问了一个类似的问题,但我没有得到任何令人满意的答案。这个问题背后的动机是这个问题的第一个(接受的)答案,粗略地说:

ArrayDeque 没有像 ArrayList 那样移动内容的开销。

在我看来,他们应该采取同样的行动。唯一的区别是它ArrayList是从List接口实现的,这意味着它可以访问任意索引。另一方面,ArrayDeque是从Queue接口实现的,它以LIFO/FIFO方式工作。

我想指出的是,它们都使用AN ARRAY来存储元素。这意味着如果他们都有一个包含这些元素的数组:

2, 4, 6, 8, 10

,arraylist.remove(0);并且arraydeque.poll();应该都删除值为 2 的first/head元素。

现在我的大问题。在这两种情况下,所有左边的数字(4、6、8、10)是否都向左移动了 1 个插槽?当我们进行任何结构修改时,它们移动元素的方式ArrayList和方式有什么区别吗?ArrayDeque

4

2 回答 2

4

ArrayList中,每个元素都被转移。

ArrayDeque中,元素不会在数组中移动。数组中表示当前队列头所在位置的指针被移动。

ArrayList(您可能会问, 为什么不这样做?它可以做到,但它只适用于在开头和结尾插入/删除元素,而不是在中间。ArrayList并不是真的设计成那样使用-- 如果你这样做,那么你有一个队列/双端队列,所以你不妨使用ArrayDeque.)

于 2020-11-15T19:57:48.063 回答
1

ArrayDeque 维护一个大小为 16 的小型内部数组,并维护指向 head 和 tail 的指针,直到其大小达到其限制。一旦达到限制,它将使数组的大小加倍。我们在 ArrayDeque 上执行的所有操作都是使用头指针和尾指针进行管理的。

但是在 ArrayList 的情况下,大多数操作都使用数组的索引。它从 0 开始。因此,对于 ArrayList,如果我们从中删除第一个元素以保持其索引,则必须移动 ArrayList 的所有元素。这对 ArrayDeque 来说不是挑战,它可以根据我们从哪里移除项目来更新 tail 或 head 的指针。

于 2020-11-15T20:04:18.197 回答