arraylist与arraydeque在元素转换中的比较?

c86crjj0  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(573)

我试着问一个类似的问题,但没有得到满意的答案。这个问题背后的动机是这个问题的第一个(公认的)答案,大致上说:
ArrayDesk没有像arraylist那样转移内容的开销。
在我看来,他们应该采取同样的行动。唯一的区别是 ArrayList 从实现 List 接口,这意味着它可以访问任意索引。在另一边, ArrayDeque 从实现 Queue 接口,以后进先出方式工作。
我想指出的是,它们都使用数组来存储元素。意思是如果它们都有一个包含以下元素的数组:

2, 4, 6, 8, 10

,正在做 arraylist.remove(0); 以及 arraydeque.poll(); 应同时移除值为2的第一个/头元素。
现在是我的大问题。在这两种情况下,所有左边的数字(4、6、8、10)是否都会左移一个槽位?两者有什么区别吗 ArrayList 以及 ArrayDeque 当我们改变结构的时候,它们是如何改变元素的?

bvpmtnay

bvpmtnay1#

arraydeque保持一个大小为16的小内部数组,并保持指向head和tail的指针,直到其大小达到其限制。一旦达到它的极限,它将使数组的大小增加一倍。我们在ArrayDesk上所做的所有操作都是用头和尾指针来管理的。
但对于arraylist,大多数操作都使用数组的索引。从0开始。因此,在arraylist的情况下,如果我们从中移除第一个元素以保持其索引,它必须移动arraylist的所有元素。这对arraydeque不是一个挑战,它只能更新tail或head的指针,这取决于我们从何处移除项目。

gxwragnw

gxwragnw2#

ArrayList ,每个元素都会被移动。
ArrayDeque ,元素在数组中不移动。数组中表示队列当前头所在位置的指针将被移动。
(为什么不呢 ArrayList 你可能会问,这样做?它可以想象地做,但它只适用于插入和移除元素在开始和结束,而不是在中间。 ArrayList 实际上并不是这样设计的——如果这样做,那么就有一个queue/deque,所以您最好使用 ArrayDeque .)

相关问题