почему удаление первого элемента в ArrayList происходит медленно?

#list #arraylist

#Список #arraylist

Вопрос:

в некоторых местах я читал, что удаление первого элемента arrayList.remove(0); происходит медленнее, чем удаление последнего, arrayList.remove(arrayList.size()-1); пожалуйста, кто-нибудь предоставит подробное объяснение. Заранее спасибо

Ответ №1:

В ArrayList элементы находятся в смежных ячейках памяти.

Поэтому, когда вы удаляете первый элемент, все элементы от 2 до n должны быть сдвинуты.

Например, если вы удаляете 1 из [1,2,3,4], 2, 3 и 4 должны быть сдвинуты влево, чтобы поддерживать непрерывное выделение памяти.

Это делает его немного медленнее.

С другой стороны, если вы удалите последний элемент, смещение не требуется, поскольку все остальные элементы находятся в нужном месте.

Ответ №2:

Реализация удаления:

 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 (используемое дополнительное время).