Почему мы не можем добавить элемент в список в n-й индекс до добавления элемента в (n-1) -й индекс, даже если указана начальная емкость - PullRequest
0 голосов
/ 21 февраля 2019

Предположим, я объявляю массив int размером 10, я могу добавить элемент к его 4-му индексу, я могу запустить код без каких-либо исключений.

int[] ar = new int[10];
ar[4] = 8;      
System.out.println(Arrays.toString(ar)); //works fine

Это потому, что если я скажу size как 10, для этого массива будет выделено столько памяти, а в каждом индексе будет сохранено начальное значение его типа.

Но дело не в этомто же самое в List.Скажем, я объявляю список с начальной емкостью 10 и пытаюсь добавить элемент к его 4-му индексу, он дает

java.lang.IndexOutOfBoundsException: Index: 4, Size: 0

List<Integer> list = new ArrayList<Integer>(10);
list.add(4, 8); //exception

Конечно, размер списка вернет 0, даже если указана начальная емкость.Почему это не похоже на Array, я думаю, что для 10 элементов списка не выделяется память?

Я догадывался, что есть ли способ заполнить List значениями по умолчанию, если емкость задана так же, как массив.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

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

Когда фактический size() переполняет массив, массив перераспределяется.

Не существует такого понятия, как массовое распределение с начальными элементами.Однако есть:

List<Integer> list = Collections.nCopies(10, Integer.valueOf(0));

И новый Stream предлагает способы динамического создания списков.

Вы можете сделать:

public <T> void add(List<T> list, int i, T obj) {
    while (list.size() < i) {
        list.add(null);
    }
    list.add(i, obj);
}

Но это сразу видно, что вы введете null s, который небезопасен и уродлив, требующий нулевых проверок.

0 голосов
/ 21 февраля 2019

Как уже упоминали другие в своих ответах, в List<Integer> list = new ArrayList<Integer>(10), 10 указывает начальную вместимость .

Указание начальной емкости - это только необязательно вещь.Вы применяете эту опцию только тогда, когда используете конкретный конструктор, который принимает начальную емкость в качестве аргумента.Когда вы используете другие конструкторы, вы не можете контролировать начальную емкость.

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

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

Как некоторые ответили, это потому, что документ API говорит так .

Это один из способов ответить на него.Но почему API-интерфейс так говорит?Почему вещи спроектированы так?

Вещи спроектированы так, потому что:

  1. Добавление элемента в позиции 8, когда в позиции 7 нет элемента, приводит к разрыву (допозиция 8).
  2. Будучи программистом, вы должны будете отслеживать, какова позиция элемента, среди всех возможных позиций (полная емкость) .В настоящее время, как программист, вы только отслеживаете положение элемента, среди всех добавленных элементов .Разве это не будет программный кошмар ?
0 голосов
/ 21 февраля 2019

Это то, что JavaDoc для ArrayList говорит о add(int index, E element):

, генерирует исключение IndexOutOfBoundsException - если индекс находится вне диапазона (размер индекса <0 || index>())

Размер - это количество сохраненных элементов, а не текущая емкость .

Тот факт, что ваш автомобиль обладает «способностью» двигаться со скоростью 100 миль в час, это не означает, что вы можете волшебным образом разогнаться до скорости от 0 до 90 миль в час за 1 секунду; -)

InДругими словами: ответ в том, что размер и вместимость не одинаковы.Емкость просто означает: «это размер, до которого может увеличиться этот список до того, как должен увеличиться базовый массив».

...