Вы можете установить начальный размер для ArrayList, выполнив это
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Тем не менее, вы не можете сделать
arr.add(5, 10);
потому что это вызывает исключение за пределами границ.
Какая польза от установки начального размера, если вы не можете получить доступ к выделенному вами пространству?
Функция add определяется как add (int index, Object element)
, поэтому я не добавляю в index 10.
Вы путаете размер списка массивов с его емкостью:
Когда вы вызываете new ArrayList < Integer > (10)
, вы устанавливаете начальную емкость списка, а не его размер. Другими словами, при построении таким образом список массивов начинает свою жизнь пустой.
Один из способов добавить десять элементов в список массивов - использовать цикл:
for (int i = 0; i < 10; i++) {
arr.add(0);
}
Сделав это, вы можете теперь изменять элементы по индексам 0.0,9.
Если вы хотите список с предопределенным размером, вы также можете использовать:
List<Integer> arr = Arrays.asList(new Integer[10]);
если вы хотите использовать Collections.fill (list, obj); чтобы заполнить список повторяющимся объектом, вы можете использовать его
ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
строка копирует 10 раз 0 в ваш ArrayList
Емкость ArrayList
не совпадает с его размером . Размер равен количеству элементов, содержащихся в «ArrayList» (и любой другой реализации «List»).
емкость - это просто длина базового массива, который используется для внутреннего хранения элементов ArrayList
и всегда больше или равен размеру списка.
При вызове set (index, element)
в списке index
относится к фактическому количеству элементов списка (= size) (который равен нулю в вашем коде, поэтому AIOOBE
брошен), а не к длине массива (= емкость) (которая является деталью реализации, специфичной для
ArrayList`).
Метод set
является общим для всех реализаций List
, таких как LinkedList
, который фактически не реализован массивом, а представляет собой связанную цепочку записей.
Редактировать : Вы фактически используете метод add (index, element)
, а не set (index, element)
, но принцип здесь тот же.
Если вы хотите добавить элементы с индексом, вы можете вместо этого использовать массив.
String [] test = new String[length];
test[0] = "add";
10 - начальная емкость AL, а не размер (который равен 0). Вы должны упомянуть начальную емкость до некоторой высокой стоимости, когда у вас будет много элементов, потому что это позволяет избежать накладных расходов на расширение емкости, поскольку вы продолжаете добавлять элементы.
Я думаю, что точный ответ на ваш вопрос будет:
Установка начального размера в ArrayList уменьшает nr. временами должно происходить перераспределение внутренней памяти. Список поддерживается массивом. Если вы укажете, т.е. начальная емкость 0, уже при первой вставке элемента внутренний массив должен быть изменен. Если у вас есть приблизительное представление о том, сколько элементов будет в вашем списке, установка начальной емкости уменьшит nr. перераспределения памяти происходит во время использования списка.
Это может помочь кому-то -
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
Опоздав на это, но после Java 8 , я лично нахожу этот следующий подход с API Stream
более кратким и может быть альтернативой [принятому ответу](https://stackoverflow.com/a/8896824 / 10734272).
Например,
Arrays.stream (новый int [size]) .boxed () .collect (Collectors.toList ())
где size
- это желаемый размер List
и без устранение, упомянутое здесь, все элементы в списке `0 инициализируются как ,.
(Я провел быстрый поиск и не видел stream
в любых опубликованных ответах - не стесняйтесь сообщить мне, если этот ответ избыточен, и я могу удалить его)
Я столкнулся с аналогичной проблемой, и просто зная, что arrayList является реализацией интерфейса List с изменяемым массивом, я также ожидаю, что вы можете добавить элемент в любую точку, но, по крайней мере, у вас есть возможность определить начальный размер. В любом случае, вы можете сначала создать массив и преобразовать его в список, например:
int index = 5;
int size = 10;
Integer[] array = new Integer[size];
array[index] = value;
...
List<Integer> list = Arrays.asList(array);
или
List<Integer> list = Arrays.asList(new Integer[size]);
list.set(index, value);
Хотя ваш список массивов имеет емкость 10, в реальном списке нет элементов. Метод добавления используется для вставки элемента в реальный список. Поскольку в нем нет элементов, вы не можете вставить элемент в индекс 5.
Если вы хотите добавить 10 элементов в свой «ArrayList», вы можете попробовать это:
for (int i = 0; i < 10; i++)
arr.add(i);
Если вы уже объявили переменную размера массива, вы бы использовали переменную size
вместо числа '10'
Прямо сейчас в вашем списке нет элементов, поэтому вы не можете добавить в индекс 5 списка, когда он не существует. Вы путаете емкость списка с его текущим размером.
Просто позвони
arr.add(10)
добавить Integer в свой ArrayList
ArrayList < String > myList = новый ArrayList < String > (10) ;
// myList.add(3, "DDD");
// myList.add(9, "III");
myList.add(0, "AAA");
myList.add(1, "BBB");
for(String item:myList){
System.out.println("inside list : "+item);
}
/ Уменьшить начальную емкость списка массивов - не что иное, как экономия времени сдвига внутри; когда мы добавляем элемент внутренне, он проверяет емкость, чтобы увеличить емкость, вы можете сначала добавить элемент с индексом 0, затем 1 и так далее. /