Как я могу инициализировать ArrayList со всеми нулями в Java? - PullRequest
139 голосов
/ 09 апреля 2011

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

// presizing 

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

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

list.get(5) 

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

Ответы [ 5 ]

384 голосов
/ 09 апреля 2011

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

Чтобы инициализировать список с 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());
10 голосов
/ 09 апреля 2011
// 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);
8 голосов
/ 09 апреля 2011

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

for (int i = 0; i < 60; i++) {
    list.add(0);
}
3 голосов
/ 30 января 2017

Реализация Java 8 (список, инициализированный 60 нулями) :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...