Вы можете установить начальный размер для ArrayList, выполнив
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Тем не менее, вы не можете сделать
arr.add(5, 10);
потому что это вызывает исключение вне границ.
Какая польза от установки начального размера, если вы не можете получить доступ к выделенному пространству?
Функция добавления определена add(int index, Object element)
так, что я не добавляю к индексу 10.
set/add
пункт п-1 .ArrayList
. Я лично хотел бы метод, который позволил бы мне установить размер так, чтобы я мог поместить вещи в определенные индексы. Этот метод явно отсутствует.Ответы:
Вы путаете размер списка массивов с его емкостью:
Когда вы звоните
new ArrayList<Integer>(10)
, вы устанавливаете начальную емкость списка , а не его размер. Другими словами, при построении таким образом список массивов начинает свою жизнь пустым.Один из способов добавить десять элементов в список массивов - использовать цикл:
Сделав это, вы теперь можете изменять элементы с индексами 0..9.
источник
while(arr.size() < 10) arr.add(0);
Можно сказать, что размер должен быть не меньше10
. Например, вы можете использоватьarr.set(9, n);
Если вы хотите список с предопределенным размером, вы также можете использовать:
источник
List
полон нулей. С Guava мы можем сделать,Ints.asList(new int[10])
что будет инициализировать наш список с0
s. Чистый образец, хотя, спасибо за пример.ArrayList
является реализациейList
интерфейса иArrays.asList
возвращаетArrayList
. Я предлагаю вам посмотреть полиморфизм.UnsupportedOperationException
если вы хотите использовать Collections.fill (list, obj); для того, чтобы заполнить список повторяющимся объектом, вы можете использовать
строка копирует 10 раз 0 в ваш ArrayList
источник
Емкость из
ArrayList
не то же самое , как ее размер . Размер равен количеству элементов, содержащихся вArrayList
(и любой другойList
реализации).Мощности просто длина основного массива , который используется для хранения internaly элементов
ArrayList
, и всегда больше или равен размеру списка.При вызове
set(index, element)
спискаindex
относится к фактическому количеству элементов списка (= размер) (который равен нулю в вашем коде, поэтомуAIOOBE
выбрасывается), а не к длине массива (= емкость) (которая зависит от деталей реализации кArrayList
).Этот
set
метод является общим для всехList
реализаций, напримерLinkedList
, который на самом деле не реализуется массивом, а представляет собой связанную цепочку записей.Изменить : Вы на самом деле используете
add(index, element)
методset(index, element)
, но принцип здесь тот же.источник
Если вы хотите добавить элементы с индексом, вы можете вместо этого использовать массив.
источник
10 - начальная емкость AL, а не размер (который равен 0). Вы должны упомянуть начальную емкость до некоторого высокого значения, когда у вас будет много элементов, потому что это позволяет избежать накладных расходов на расширение емкости, поскольку вы продолжаете добавлять элементы.
источник
Я думаю, что точный ответ на ваш вопрос будет:
Установка начального размера в ArrayList уменьшает число. раз перераспределение внутренней памяти должно произойти. Список поддерживается массивом. Если вы укажете, т. Е. Начальную емкость 0, то уже при первой вставке элемента размер внутреннего массива придется изменить. Если у вас есть приблизительное представление о том, сколько элементов будет в вашем списке, установка начальной емкости уменьшит число. перераспределения памяти происходит во время использования списка.
источник
Это может помочь кому-то -
источник
Опоздав на это, но после Java 8 я лично считаю следующий подход с
Stream
API более лаконичным и может быть альтернативой принятому ответу .Например,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
где
size
желаемыйList
размер и без недостатка, упомянутого здесь , все элементы вList
инициализируются как0
.(Я сделал быстрый поиск и не увидел
stream
ни одного опубликованного ответа - не стесняйтесь, дайте мне знать, если этот ответ является избыточным, и я могу удалить его)источник
В данный момент в вашем списке нет элементов, поэтому вы не можете добавить его в индекс 5 списка, когда он не существует. Вы путаете емкость списка с его текущим размером.
Просто позвони:
добавить Integer в ваш ArrayList
источник
Хотя ваш массив имеет емкость 10, настоящий список не содержит здесь элементов. Метод add используется для вставки элемента в реальный список. Поскольку он не имеет элементов, вы не можете вставить элемент в индекс 5.
источник
Если вы хотите добавить 10 элементов к себе,
ArrayList
вы можете попробовать это:Если вы уже объявили переменную размера массива, вы бы использовали переменную
size
вместо числа «10»источник
Я столкнулся с подобной проблемой, и просто зная, что arrayList является реализацией изменяемого размера массива интерфейса List, я также ожидаю, что вы можете добавить элемент в любую точку, но, по крайней мере, иметь возможность определить начальный размер. В любом случае, вы можете сначала создать массив и преобразовать его в список, например:
или
источник
ArrayList myList = new ArrayList (10);
/ * Заявить, что первоначальный потенциал arraylist - это не что иное, как экономия времени на внутреннюю перестановку; когда мы добавляем элемент внутренне, он проверяет емкость, чтобы увеличить емкость, вы можете добавить элемент с индексом 0 изначально, затем 1 и так далее. * /
источник
Мои два цента на
Stream
. Я думаю, что лучше использоватьс гибкостью, чтобы поставить любые начальные значения.
источник