我被告知
当我们创建一个ArrayList时,内部是一个特定大小的数组 (比如说50)已创建。当添加到列表中的项目超过时 50,在内部创建一个更大尺寸的新数组(比如说100) 他们将原始数组的项目复制到这个新数组。
然后我被告知
当我们从列表末尾删除一个项目时,所有这一切都已完成 内部正在内部递减列表的大小。但是 删除位于开头某处的元素 ArrayList非常慢,因为它必须复制所有的 后续项目退后一步,所以很慢。
但正如第一个引文所暗示的那样,ArrayList在内部由一个数组表示,并且因为一旦分配了数组就无法改变数组的大小;你必须创建一个新的数组。
我的观念是否正确?
如果是,那么我不明白为什么从arraylist开始删除元素所需的时间/步数要比从元素中删除元素时要快得多数组的结尾。
请帮助我理解。
答案 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)
当你从头开始删除元素时,没有创建新数组,但是当你从头开始删除一个元素时,如果它的最后一个元素比第一个元素需要移动的元素要多得多。一,你的时差。