Java Как на самом деле работает функция Vector `removeElementAt`?

Я новичок в 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"));
    }

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

Если вы учитесь с нуля, я предлагаю избегать классов, которые были устаревшими годами, таких как Vector. Вместо этого посмотрите на ArrayList.

assylias 07.06.2018 11:01

Спасибо, приму ваше предложение. Но я просто хочу выяснить причину, по которой моя гипотеза неверна? Может я упрямый программист, ха-ха

Chopping 07.06.2018 11:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Давайте посмотрим на сигнатуру метода 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 будет закрыто

Chopping 07.06.2018 11:10

Большое спасибо, моя проблема в том, что я неправильно понимаю значение слова.

Chopping 07.06.2018 11:11

Вы копируете все, начиная с index + 1, записывая их (последовательно), начиная с index

user7 07.06.2018 11:12

Я согласен с твоим !!

Chopping 07.06.2018 11:13

Другие вопросы по теме