移动元素中的 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 个位置? ArrayList
和 ArrayDeque
在我们进行任何结构修改时它们移动元素的方式有什么区别吗?
在ArrayList
中,每个元素都被移动了。
在ArrayDeque
中,数组中的元素不移动。数组中表示当前队列头所在位置的指针被移动。
(为什么 ArrayList
不这样做,你可能会问?可以想象它可以做到,但它只适用于开头和结尾的 inserting/removing 个元素,而不适用于中间。ArrayList
并不是真正设计成那样使用的——如果你这样做,那么你有一个 queue/deque,所以你也可以使用 ArrayDeque
。)
ArrayDeque 维护一个大小为 16 的小内部数组,并维护指向 head 和 tail 的指针,直到其大小达到其限制。一旦达到极限,它将使数组的大小加倍。我们在 ArrayDeque 上执行的所有操作都由头指针和尾指针管理。
但在 ArrayList 的情况下,大多数操作都使用数组索引。它从 0 开始。因此,如果我们从 ArrayList 中删除第一个元素以维护其索引,则它必须移动 ArrayList 的所有元素。这对 ArrayDeque 来说不是挑战,它可以只更新 tail 或 head 的指针,这取决于我们从哪里删除项目。
我试过问类似的问题,但没有得到满意的答案。这个问题背后的动机是 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 个位置? ArrayList
和 ArrayDeque
在我们进行任何结构修改时它们移动元素的方式有什么区别吗?
在ArrayList
中,每个元素都被移动了。
在ArrayDeque
中,数组中的元素不移动。数组中表示当前队列头所在位置的指针被移动。
(为什么 ArrayList
不这样做,你可能会问?可以想象它可以做到,但它只适用于开头和结尾的 inserting/removing 个元素,而不适用于中间。ArrayList
并不是真正设计成那样使用的——如果你这样做,那么你有一个 queue/deque,所以你也可以使用 ArrayDeque
。)
ArrayDeque 维护一个大小为 16 的小内部数组,并维护指向 head 和 tail 的指针,直到其大小达到其限制。一旦达到极限,它将使数组的大小加倍。我们在 ArrayDeque 上执行的所有操作都由头指针和尾指针管理。
但在 ArrayList 的情况下,大多数操作都使用数组索引。它从 0 开始。因此,如果我们从 ArrayList 中删除第一个元素以维护其索引,则它必须移动 ArrayList 的所有元素。这对 ArrayDeque 来说不是挑战,它可以只更新 tail 或 head 的指针,这取决于我们从哪里删除项目。