【问题标题】:ArrayList VS ArrayDeque in shifting elements?ArrayList VS ArrayDeque 在移动元素中?
【发布时间】:2021-02-27 02:56:44
【问题描述】:

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

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 个插槽? ArrayListArrayDeque 在我们进行任何结构修改时它们移动元素的方式有什么区别吗?

【问题讨论】:

标签: java list arraylist queue arraydeque


【解决方案1】:

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

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

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

【讨论】:

  • 如果我删除了第一个元素,它们如何不动?这意味着我的第二个元素将占据第一名,那么其余元素是否必须转移?请问可以清除吗?不管指针如何,这是可以理解的。
  • @Stefan:我不明白你的问题。如果删除 ArrayList 的第一个元素,是的,第二个元素移动到第一个位置,所有其他元素也移动一个位置。
  • 对不起,我应该更准确。我在为ArrayDeque 提出这个特殊问题。我的意思是如果我删除零索引元素,它们如何不动?让我们暂时忽略光标,专注于普通数组。
  • 第一个元素设置为空。其他元素不动。
【解决方案2】:

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

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

【讨论】:

  • 好的,它改变了指针位置。但是该元素仍然必须删除。那么其余的元素去哪里了呢?在 ArrayDeque 中删除零索引元素(头)后会发生什么?
  • 其余元素保留在操作前 ArrayDeque 中的任何位置。
  • 所以我仍然会有大小为 5 的数组,只是索引 0 处的元素现在消失了,指针指向索引 1?这意味着如果我不断从头部删除元素并且指针总是指向下一个元素,我的数组将无限增长。我一定在这里遗漏了什么。
  • 或者实际上我将拥有大小为 4 的数组(头部被移除),但元素永远不会移动。这是正确的观点吗?
  • 如果ArrayDeque中只有4个元素,内部会维护一个16的数组,但是size()返回4..就是头尾指针的偏移量之差。
猜你喜欢
  • 2015-06-17
  • 1970-01-01
  • 2014-03-19
  • 2017-10-13
  • 2021-02-27
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2018-08-03
相关资源
最近更新 更多