Java ArrayList добавление элемента в n-й позиции - PullRequest
0 голосов
/ 29 ноября 2018

У меня вопрос по поводу ArrayList.Когда инициализируемый массив списков по умолчанию равен 10.

Когда новые элементы добавляются в массив, при достижении размера массива на 75%, скажем, при добавлении 7-го значения в массиве он увеличит длину.

У меня есть arraylist, и я добавил в него 3 значения (скажем, 10, 20 и 30).Я пытаюсь добавить следующее значение по 10-му индексу, но оно выдает IndexOutOfBoundsException.

Почему не было разрешено добавлять значения с использованием этого значения индекса?

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Размер ArrayList, а не 10 при создании объекта ArrayList со значением по умолчанию.10 is the size of Array backing список, который Object[] elementData.Size списка по-прежнему returns 0, если вы не добавили ни одного элемента.Таким образом, если попытаться установить индекс с размером больше, он выдаст исключение.Ниже приведены вызовы методов из ArrayList#set()

private void rangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
0 голосов
/ 29 ноября 2018

Когда мы создаем ArrayList, внутренний массив имеет размер 10. Но они также являются элементом в ArrayList с именем int size, его значение равно 0 и увеличивается только при добавлении элементов в массив.Тот же атрибут «size» используется, когда мы вызываем метод size ().

Теперь, если мы пытаемся добавить элемент с 10-м индексом, а атрибут «size» по-прежнему равен 3, проверка выполняется, как показано ниже

if (index > size || index < 0) throw new IndexOutOfBoundsException; 

Следовательно, вы получаете исключение.

enter image description here

0 голосов
/ 29 ноября 2018

Поскольку метод add расширяет List, вызывая ensureCapacityInternal, см. Здесь

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

, в то время как метод add(index, element) не расширяет List, если индекс выходит за пределыуже.

  /**
 * Inserts the specified element at the specified position in this
 * list. Shifts the element currently at that position (if any) and
 * any subsequent elements to the right (adds one to their indices).
 *
 * @param index index at which the specified element is to be inserted
 * @param element element to be inserted
 * @throws IndexOutOfBoundsException {@inheritDoc}
 */
public void add(int index, E element) {
    rangeCheckForAdd(index);

    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;
}

Это поведение по умолчанию. Источник

0 голосов
/ 29 ноября 2018

По умолчанию емкость составляет 10, а не размер.Размер нового ArrayList равен 0. Если в списке только 3 элемента, вы не можете вставить что-либо в индекс 10, потому что этот индекс превышает размер списка.

Из документация :

Броски:

IndexOutOfBoundsException - если индекс выходит за пределы диапазона (index <0 || index> size ())

...