Если вы посмотрите на реализацию удаления ArrayList , он использует локальный метод fastRemove (index) следующим образом: -
/ * * Закрытый метод удаления, который пропускает проверку границ и не *вернуть значение удалено.* /
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
}
Он использует arraycopy, который является доказательством того, что вы получаете новый список свежих объектов, а не заполненный ноль между ними.Это доказательство?