为什么删除ArrayList中的第一个元素很慢?

时间:2014-06-26 12:21:37

标签: list arraylist

在某些我已经阅读过的内容中,删除第一个元素arrayList.remove(0);比删除最后一个元素arrayList.remove(arrayList.size()-1);要慢一些,请一些人提供详细说明。提前致谢

2 个答案:

答案 0 :(得分:1)

ArrayList中,元素位于连续的内存位置。

因此,当您删除第一个元素时,必须移动从2到n的所有元素。

E.g。如果从[1,2,3,4]中删除1,则必须将2,3和4移到左侧以保持连续的内存分配。

这会让它慢一点。

另一方面,如果删除最后一个元素,则不需要移位,因为所有剩余元素都在适当的位置。

答案 1 :(得分:0)

Implementation of remove

public E More ...remove(int index) {
     rangeCheck(index);

     modCount++;
     E oldValue = elementData(index);

     int numMoved = size - index - 1;
     if (numMoved > 0)
         System.arraycopy(elementData, index+1, elementData, index,
                          numMoved);
     elementData[--size] = null; // Let gc do its work

     return oldValue;
 }

值存储在数组中,因此如果删除最后一个值,则只将数组中的值设置为null(elementData [ - size] = null)。但如果它在其他地方,它需要使用arraycopy来移动它之后的所有元素。因此,在上面的代码中,您可以清楚地看到: index = size - 1 表示arraycopy调用(使用的额外时间)。