Java ArrayList добавляет элемент в n-ю позицию

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

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

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

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

Не могли бы вы отредактировать сообщение и добавить свой код, пожалуйста?

veben 29.11.2018 14:27

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

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

Ответы 4

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

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

Throws:

IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

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

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

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

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

Спасибо. теперь понял.

user10722697 29.11.2018 14:31

Хорошее объяснение @Phani Kumar. Спасибо

user10722697 29.11.2018 15:07

Поскольку метод 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++;
}

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

Размер 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));
}

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