Похоже, arraylist
не выполняет свою работу по приживанию:
// presizing
ArrayList<Integer> list = new ArrayList<Integer>(60);
После этого, когда я пытаюсь получить к нему доступ:
list.get(5)
Вместо возврата 0 он выбрасывает IndexOutOfBoundsException: индекс 5 выходит за пределы длины 0 .
Есть ли способ инициализировать все элементы до 0 точного размера, как это делает C ++?
java
collections
Мороз
источник
источник
Ответы:
Целое число, переданное в конструктор, представляет его начальную емкость , т. Е. Количество элементов, которые он может хранить, прежде чем ему потребуется изменить размер своего внутреннего массива (и не имеет ничего общего с начальным количеством элементов в списке).
Чтобы инициализировать список с 60 нулями, вы делаете:
Если вы хотите создать список из 60 различных объектов, вы можете использовать Stream API со
Supplier
следующим:источник
ArrayList
, а просто программировать наList
. Это решение осталось за ФП, конечно.nCopies
неизменным, поэтому,ArrayList
вероятно, хорошая идея - создать новый .nCopies
со сложным объектом коллекция создается не с 60 различными объектами, а 60 раз с одним и тем же объектом. Так что используйте это только для примитивов.nCopies
полезно использовать ссылочные типы: неизменяемые объекты, такие как строки, шаблоны нулевых объектов, константы перечисления, ... В любом случае, я обновил ответ решением для создания 60 различных объектов.источник
IndexOutOfBoundsException
сList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
Arrays.asList
производит,List
что не позволяет добавлять или удалять, так что это не совсем то, что хочет ОП. Это сработало бы, если бы все, что вам нужно было сделатьset
, но вам лучше использовать массив в этом случае.60, которые вы передаете, это просто начальная емкость для внутреннего хранилища. Это намек на то, насколько большим вы думаете, он может быть, но, конечно, этим не ограничивается. Если вам нужно предварительно установить значения, вам придется установить их самостоятельно, например:
источник
Реализация Java 8 (список инициализируется
60
нулями) :new int[N]
- создает массив, заполненный нулями и длиной Nboxed()
- каждый элемент упакован в целое числоcollect(Collectors.toList())
- собирает элементы потокаисточник
Это не так. ArrayList просто использует массив как внутреннее восстановление. Если вы добавите более 60 элементов, нижележащий массив будет расширен. Как бы то ни было, вы можете добавить столько элементов в этот массив, сколько у вас оперативной памяти.
источник