Исходный размер для ArrayList
Вы можете установить начальный размер для ArrayList, выполнив
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Однако вы не можете сделать
arr.add(5, 10);
поскольку он вызывает исключение за пределами.
Каково использование установки начального размера, если вы не можете получить доступ к пространству, которое вы выделили?
Функция добавления определяется как add(int index, Object element)
, поэтому я не добавляю к индексу 10.
Ответы
Ответ 1
Вы путаете размер массива с его емкостью:
- размер - количество элементов в списке;
- емкость - это количество элементов, которые список может использовать без перераспределения внутренних структур.
Когда вы вызываете new ArrayList<Integer>(10)
, вы устанавливаете начальную емкость списка, а не ее размер. Другими словами, при построении таким образом список массивов начинает свою жизнь пустой.
Один из способов добавления десяти элементов в список массивов - использование цикла:
for (int i = 0; i < 10; i++) {
arr.add(0);
}
Сделав это, теперь вы можете изменять элементы по индексам 0..9.
Ответ 2
Если вам нужен список с предопределенным размером, вы также можете использовать:
List<Integer> arr = Arrays.asList(new Integer[10]);
Ответ 3
если вы хотите использовать Collections.fill(list, obj); для того, чтобы заполнить список повторным объектом, вы можете использовать
ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
строка копирует 10 раз 0 в ваш ArrayList
Ответ 4
Емкость ArrayList
не совпадает с ее размером. Размер равен числу элементов, содержащихся в ArrayList
(и любой другой реализации List
).
Емкость - это просто длина базового массива, который используется для внутреннего хранения элементов ArrayList
и всегда больше или равно размер списка.
При вызове set(index, element)
в списке index
относится к фактическому числу элементов списка (= размер) (который равен нулю в вашем коде, поэтому бросается AIOOBE
), а не в массив length (= capacity) (которая представляет собой деталь реализации, специфичную для ArrayList
).
Метод set
является общим для всех реализаций List
, таких как LinkedList
, который фактически не реализуется массивом, а как связанная цепочка записей.
Изменить. Фактически вы используете метод add(index, element)
, а не set(index, element)
, но принцип здесь один и тот же.
Ответ 5
Если вы хотите добавить элементы с индексом, вы можете вместо этого использовать массив.
String [] test = new String[length];
test[0] = "add";
Ответ 6
10 - начальная емкость AL, а не размер (который равен 0). Вы должны упомянуть начальную емкость к некоторому высокому значению, когда у вас будет много элементов, потому что это позволяет избежать накладных расходов на расширение емкости по мере добавления элементов.
Ответ 7
Я думаю, что точный ответ на ваш вопрос будет следующим:
Установка начального размера в ArrayList уменьшает число nr. из-за необходимости перераспределения внутренней памяти.
Список поддерживается массивом. Если вы укажете, то есть начальную емкость 0, уже при первой вставке элемента внутренний размер массива должен быть изменен.
Если у вас есть приблизительное представление о том, сколько элементов будет удерживать ваш список, установка начальной емкости уменьшит nr. перераспределения памяти происходит во время использования списка.
Ответ 8
Это может помочь кому-то -
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
Ответ 9
Опоздав на это, но после Java 8 я лично нахожу этот следующий подход с API Stream
более лаконичным и может стать альтернативой принятому ответу.
Например,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
где size
- желаемый размер List
, и без упомянутого здесь недостатка все элементы в List
инициализируются как 0
.
(Я сделал быстрый поиск и не увидел stream
ни в одном опубликованном ответе - не стесняйтесь сообщить мне, является ли этот ответ излишним, и я могу удалить его)
Ответ 10
Прямо сейчас в вашем списке нет элементов, поэтому вы не можете добавить к индексу 5 списка, когда он не существует. Вы путаете емкость списка с его текущим размером.
Просто позвоните:
arr.add(10)
чтобы добавить Integer в ваш ArrayList
Ответ 11
Хотя ваш аррайалист имеет емкость 10, в реальном списке нет элементов. Метод add используется для вставки элемента в настоящий список. Поскольку у него нет элементов, вы не можете вставить элемент в индекс из 5.
Ответ 12
Если вы хотите добавить 10 элементов в свой ArrayList
, вы можете попробовать следующее:
for (int i = 0; i < 10; i++)
arr.add(i);
Если вы уже объявили переменную размера массива, вы должны использовать переменную size
вместо номера '10'
Ответ 13
Я сталкивался с подобной проблемой, и просто зная, что 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);
Ответ 14
ArrayList myList = новый ArrayList (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);
}
/* Объявить начальную емкость arraylist - это не что иное, как сохранение времени смещения внутри; когда мы добавляем элемент внутри себя, проверяем capasity, чтобы увеличить capasity, вы могли бы добавить элемент с индексом 0 сначала, а затем 1 и так далее. */
Ответ 15
Мои два цента на Stream
. Я думаю, что лучше использовать
IntStream.generate(i -> MyClass.contruct())
.limit(INT_SIZE)
.collect(Collectors.toList());
с гибкостью, чтобы поставить любые начальные значения.