为什么从ArrayList的开头删除一个元素比从它结束的元素慢?

时间:2016-01-24 11:32:44

标签: java arrays arraylist

我被告知

  

当我们创建一个ArrayList时,内部是一个特定大小的数组   (比如说50)已创建。当添加到列表中的项目超过时   50,在内部创建一个更大尺寸的新数组(比如说100)   他们将原始数组的项目复制到这个新数组。

然后我被告知

  

当我们从列表末尾删除一个项目时,所有这一切都已完成   内部正在内部递减列表的大小。但是   删除位于开头某处的元素   ArrayList非常慢,因为它必须复制所有的   后续项目退后一步,所以很慢。

但正如第一个引文所暗示的那样,ArrayList在内部由一个数组表示,并且因为一旦分配了数组就无法改变数组的大小;你必须创建一个新的数组。

  • 这意味着当在ArrayList的末尾删除一个元素时,会有一个新数组 在内部创建 ,其大小比原始大小小一个 array ,并将第一个数组的所有元素复制到新数组。
  • 当从ArrayList的开头删除一个元素时,一个新元素 数组创建内部,其大小小于1 原始数组,并将第一个数组的所有元素复制到 新的,使每个后续元素的索引位置在新的 数组比该元素的索引位置少一个 上一个/原始阵列。

我的观念是否正确?

如果是,那么我不明白为什么从arraylist开始删除元素所需的时间/步数要比从元素中删除元素时要快得多数组的结尾。

请帮助我理解。

2 个答案:

答案 0 :(得分:4)

不,这不对。只有当数组中没有足够的空间来包含所有元素时,才会创建一个新数组。

包含4个元素(a,b,c,d)的ArrayList表示如下:

array: [a, b, c, d, null, null, null, null, null, null]
size: 4

从列表中删除最后一个元素会将其内容更改为

array: [a, b, c, null, null, null, null, null, null, null]
size: 3

所有列表必须做的是递减整数大小,并将第4个元素设置为null。

删除第一个元素会将其内容更改为

array: [b, c, null, null, null, null, null, null, null, null]
size: 2

列表必须递减大小,将a复制到第一个索引,将b复制到第二个索引,将第三个索引设置为null。这是更多的工作,特别是如果列表更长。

答案 1 :(得分:2)

当你从头开始删除元素时,没有创建新数组,但是当你从头开始删除一个元素时,如果它的最后一个元素比第一个元素需要移动的元素要多得多。一,你的时差。