Как я могу инициализировать ArrayList со всеми нулями в Java?

Похоже, что arraylist не выполняет свою работу для настройки:

// presizing 

ArrayList<Integer>() list = new ArrayList<Integer>(60);

Впоследствии, когда я пытаюсь получить к нему доступ,

list.get(5) 

Показывает нуль вместо 0. Есть ли способ инициализировать все элементы до 0 точного размера, как то, что делает С++?

Ответ 1

Целое число, переданное конструктору, представляет его начальную емкость, т.е. количество элементов, которое оно может удерживать, прежде чем потребуется изменить его внутренний массив (и не имеет ничего общего с начальным числом элементов в списке).

Для инициализации списка с 60 нулями:

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));

Если вы хотите создать список с 60 различными объектами, вы можете использовать Stream API с Supplier следующим образом:

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());

Ответ 2

// apparently this is broken. Whoops for me!
java.util.Collections.fill(list,new Integer(0));

// this is better
Integer[] data = new Integer[60];
Arrays.fill(data,new Integer(0));
List<Integer> list = Arrays.asList(data);

Ответ 3

Пропуск 60 - это только начальная емкость для внутреннего хранилища. Это намек на то, насколько велика вы думаете, что это может быть, но, конечно, это не ограничивается этим. Если вам нужно задавать значения, вам нужно будет установить их самостоятельно, например:

for (int i = 0; i < 60; i++) {
    list.add(0);
}

Ответ 4

реализация Java 8 (список инициализирован с помощью 60 нолей):

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N] - создает массив, заполненный нулями и длиной N
  • boxed() - каждый элемент, помещенный в поле Integer
  • collect(Collectors.toList()) - собирает элементы потока

Ответ 5

Это не так. ArrayList просто использует массив как внутреннее чувство. Если вы добавите более 60 элементов, то подкладочный массив будет экспансирован. Как бы вы ни добавляли столько элементов к этому массиву, сколько у вас было RAM.