Начальный размер для ArrayList - PullRequest
219 голосов
/ 17 января 2012

Вы можете установить начальный размер для ArrayList, выполнив

ArrayList<Integer> arr=new ArrayList<Integer>(10);

Однако, вы не можете сделать

arr.add(5, 10);

потому что это вызывает исключение вне границ.

Какая польза от установки начального размера, если вы не можете получить доступ к выделенному пространству?

Функция добавления определена как add(int index, Object element), поэтому я не добавляю к индексу 10.

Ответы [ 14 ]

334 голосов
/ 17 января 2012

Вы путаете размер списка массивов с его емкостью:

  • размер - количество элементов в списке;
  • емкость - это количество элементов, которое может вместить список без перераспределения его внутренних структур.

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

Один из способов добавить десять элементов в список массивов - использовать цикл:

for (int i = 0; i < 10; i++) {
  arr.add(0);
}

Сделав это, вы теперь можете изменять элементы с индексами 0..9.

90 голосов
/ 11 мая 2014

Если вы хотите список с предопределенным размером, вы также можете использовать:

List<Integer> arr = Arrays.asList(new Integer[10]);
39 голосов
/ 09 апреля 2016

, если вы хотите использовать Collections.fill (list, obj);чтобы заполнить список повторяющимся объектом, вы можете использовать

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));

, строка 10 раз копирует 0 в ваш ArrayList

18 голосов
/ 17 января 2012

Емкость ArrayList не совпадает с размером . Размер равен количеству элементов, содержащихся в ArrayList (и любой другой реализации List).

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

При вызове set(index, element) в списке,index относится к фактическому количеству элементов списка (= размер) (который равен нулю в вашем коде, поэтому выбрасывается AIOOBE), а не к длине массива (= емкость) (которая зависит от конкретной детали реализациив ArrayList).

Метод set является общим для всех реализаций List, таких как LinkedList, который фактически не реализуется массивом, а представляет собой связанную цепочку записей.

Редактировать : Вы фактически используете метод add(index, element), а не set(index, element), но принцип здесь тот же.

10 голосов
/ 13 августа 2014

Если вы хотите добавить элементы с индексом, вы можете вместо этого использовать массив.

    String [] test = new String[length];
    test[0] = "add";
9 голосов
/ 17 января 2012

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

6 голосов
/ 17 января 2012

Полагаю, что точный ответ на ваш вопрос будет следующим:

Установка начального размера в ArrayList уменьшает число.раз перераспределение внутренней памяти должно произойти.Список поддерживается массивом.Если вы укажете, т. Е. Начальную емкость 0, то уже при первой вставке элемента размер внутреннего массива придется изменить.Если у вас есть приблизительное представление о том, сколько элементов будет в вашем списке, установка начальной емкости уменьшит число.перераспределения памяти происходит при использовании списка.

2 голосов
/ 26 февраля 2019

Опоздав на это, но после Java 8 я лично считаю следующий подход с Stream API более лаконичным и может быть альтернативой принятому ответу .

Например,

Arrays.stream(new int[size]).boxed().collect(Collectors.toList())

, где size - желаемый размер List и без недостаток, упомянутый здесь , все элементы вList инициализируются как 0.

(Я сделал быстрый поиск и не увидел stream ни в одном опубликованном ответе - не стесняйтесь сообщить мне, является ли этот ответ излишним, и я могу удалитьона)

2 голосов
/ 14 июня 2018

Это может кому-то помочь -

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
1 голос
/ 12 октября 2014

Если вы хотите добавить 10 элементов к вашему ArrayList, вы можете попробовать это:

for (int i = 0; i < 10; i++)
    arr.add(i);

Если вы уже объявили переменную размера массива, вы бы использовали переменную size вместо числа '10'

...