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