Я новичок в Java и сейчас изучаю Коллекции на Java. Что меня смущает, так это то, что я не могу понять, как работает функция removeElementAt, когда я читаю исходный код Vector.
То, что меня озадачило, заключается в том, что эта функция удаляет элемент, копируя оставшиеся элементы с помощью функции System.arraycopy, которая просто копирует исходный массив в место назначения, ограниченное указанной длиной. Что, если я хочу удалить эти элементы, расположенные в середине массива? Я предполагаю, что он отбросит те элементы, которые находятся за выделенным элементом, но это не работает так, как я думал.
Функция removeElementAt:
public synchronized void removeElementAt(int index) {
modCount++;
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
elementCount--;
elementData[elementCount] = null; /* to let gc do its work */
}
Далее следует мой тестовый код:
/**
* Test if it will discard those element in the back
*/
public void TestRemoveElementAt(){
Vector<Integer> vector = new Vector<Integer>();
for(int i=0;i<10;i++){
vector.addElement(i);
}
// try to remove the number "7"
vector.removeElementAt(7);
// expected: 0 1 2 3 4 5 6
// actual: 0 1 2 3 4 5 6 8 9
vector.iterator().forEachRemaining(ele->System.out.print(ele+"\t"));
}
Что не так с моей гипотезой?
Спасибо, приму ваше предложение. Но я просто хочу выяснить причину, по которой моя гипотеза неверна? Может я упрямый программист, ха-ха




Давайте посмотрим на сигнатуру метода System.arraycopy
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
Из javadoc System.arraycopy
Copies an array from the specified source array, beginning at the specified position, to the specified position of the destination array.
Как это называется
System.arraycopy(elementData, index + 1, elementData, index, j);
Здесь источник и место назначения совпадают (elementData)
Мы говорим начать с index + 1 (srcPos) и скопировать элементы длины j в тот же массив, начиная с индекса index (destPos), где j = elementCount - index - 1;
Итак, j будет обозначать количество элементов после index, которые вы хотите удалить. Таким образом, это сдвигает все элементы после index на одну позицию вниз.
!! Кажется, я уловил ключ! просто потому, что операция копирования начинается с index+1, что означает, что пространство памяти index будет закрыто
Большое спасибо, моя проблема в том, что я неправильно понимаю значение слова.
Вы копируете все, начиная с index + 1, записывая их (последовательно), начиная с index
Я согласен с твоим !!
Если вы учитесь с нуля, я предлагаю избегать классов, которые были устаревшими годами, таких как Vector. Вместо этого посмотрите на ArrayList.