У меня вопрос по ArrayList. Когда Arraylist инициализирован, размер по умолчанию равен 10.
Когда в Arraylist добавляются новые элементы, при достижении размера Arraylist на 75%, скажем, при добавлении 7-го значения в Arraylist длина будет увеличиваться.
У меня есть Arraylist, и я добавил в него 3 значения (скажем, 10, 20 и 30). Я пытаюсь добавить следующее значение в 10-й индекс, но его бросает IndexOutOfBoundsException.
Почему нельзя было складывать значения, используя это значение индекса?
Емкость есть только из соображений производительности. Он введен потому, что изменение размера внутреннего массива каждый раз при добавлении элемента замедляет работу. Емкость по умолчанию подходит в большинстве случаев. Вы должны передавать другое значение в качестве емкости только в том случае, если вы заранее знаете что-то о возможном размере, например, если массив станет очень большим.




По умолчанию емкость - 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;
Следовательно, вы получаете исключение.
Спасибо. теперь понял.
Хорошее объяснение @Phani Kumar. Спасибо
Поскольку метод 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));
}
Не могли бы вы отредактировать сообщение и добавить свой код, пожалуйста?