移动元素中的 ArrayList VS ArrayDeque?

ArrayList VS ArrayDeque in shifting elements?

我试过问类似的问题,但没有得到满意的答案。这个问题背后的动机是 this question 的第一个(已接受的)答案,大致说:

ArrayDeque doesn't have the overhead of shifting contents like ArrayList.

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

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

2, 4, 6, 8, 10

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

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

ArrayList中,每个元素都被移动了。

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

(为什么 ArrayList 不这样做,你可能会问?可以想象它可以做到,但它只适用于开头和结尾的 inserting/removing 个元素,而不适用于中间。ArrayList 并不是真正设计成那样使用的——如果你这样做,那么你有一个 queue/deque,所以你也可以使用 ArrayDeque。)

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

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