我试着问一个类似的问题,但没有得到满意的答案。这个问题背后的动机是这个问题的第一个(公认的)答案,大致上说:
ArrayDesk没有像arraylist那样转移内容的开销。
在我看来,他们应该采取同样的行动。唯一的区别是 ArrayList
从实现 List
接口,这意味着它可以访问任意索引。在另一边, ArrayDeque
从实现 Queue
接口,以后进先出方式工作。
我想指出的是,它们都使用数组来存储元素。意思是如果它们都有一个包含以下元素的数组:
2, 4, 6, 8, 10
,正在做 arraylist.remove(0);
以及 arraydeque.poll();
应同时移除值为2的第一个/头元素。
现在是我的大问题。在这两种情况下,所有左边的数字(4、6、8、10)是否都会左移一个槽位?两者有什么区别吗 ArrayList
以及 ArrayDeque
当我们改变结构的时候,它们是如何改变元素的?
2条答案
按热度按时间bvpmtnay1#
arraydeque保持一个大小为16的小内部数组,并保持指向head和tail的指针,直到其大小达到其限制。一旦达到它的极限,它将使数组的大小增加一倍。我们在ArrayDesk上所做的所有操作都是用头和尾指针来管理的。
但对于arraylist,大多数操作都使用数组的索引。从0开始。因此,在arraylist的情况下,如果我们从中移除第一个元素以保持其索引,它必须移动arraylist的所有元素。这对arraydeque不是一个挑战,它只能更新tail或head的指针,这取决于我们从何处移除项目。
gxwragnw2#
在
ArrayList
,每个元素都会被移动。在
ArrayDeque
,元素在数组中不移动。数组中表示队列当前头所在位置的指针将被移动。(为什么不呢
ArrayList
你可能会问,这样做?它可以想象地做,但它只适用于插入和移除元素在开始和结束,而不是在中间。ArrayList
实际上并不是这样设计的——如果这样做,那么就有一个queue/deque,所以您最好使用ArrayDeque
.)