Ответ 1
Смотрите документацию для ArrayList#remove(int)
, как в следующем синтаксисе:
list.remove(list.size() - 1)
Вот как это реализовано. elementData
выполняет поиск массива поддержки (поэтому он может вырезать его из массива), который должен быть постоянным (поскольку JVM знает размер ссылки на объект и количество записей, которые он может вычислить смещение), и numMoved
для этого случая 0
:
public E remove(int index) {
rangeCheck(index); // throws an exception if out of bounds
modCount++; // each time a structural change happens
// used for ConcurrentModificationExceptions
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;
}