Java Как на самом деле работает функция Vector `removeElementAt`? - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в Java и сейчас изучаю Коллекции на Java. Меня смущает то, что я не могу понять, как работает функция removeElementAt Когда я читаю исходный код Vector.

Смысл, который озадачил меня, заключается в том, что эта функция удаляет элемент, копируя эти оставшиеся элементы с помощью функции System.arraycopy, которая просто копирует исходный массив в пункт назначения, ограниченный указанной длиной. Что, если я хочу удалить эти элементы, насередина массива? Я предполагаю, что он отбросит те элементы, которые находятся за элементом spcified, но он не работает так, как я думал.

Функция 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"));
    }

Что не так с моей гипотезой?

1 Ответ

0 голосов
/ 07 июня 2018

Посмотрим на сигнатуру метода System.arraycopy

public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);

Из javadoc System.arraycopy

Копирует массив из указанного исходного массива, начиная с указанногоposition, в указанную позицию массива назначения.

Как он называется

System.arraycopy(elementData, index + 1, elementData, index, j);

Здесь источник и назначение совпадают (elementData)

Мы говорим начинать с index + 1 ( srcPos ) и копировать элементы длиной j в тот же массив, начиная с индекса index ( destPos ), где j = elementCount - index - 1;

Итак, j будет обозначать количество элементов после index, которое вы хотите удалить.Таким образом, это сдвигает все элементы после index на одну позицию вниз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...