Como posso inicializar um ArrayList com todos os zeros em Java?

161

Parece que arraylistnão está fazendo seu trabalho de presizer:

// presizing 

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

Depois, quando tento acessá-lo:

list.get(5) 

Em vez de retornar 0, lança IndexOutOfBoundsException: Índice 5 fora dos limites para o comprimento 0 .

Existe uma maneira de inicializar todos os elementos para 0 de um tamanho exato como o C ++ faz?

geada
fonte
4
O Javadoc desse construtor especifica que ele cria uma "lista vazia". Está fazendo o seu trabalho.
colind

Respostas:

429

O número inteiro passado ao construtor representa sua capacidade inicial , ou seja, o número de elementos que ele pode conter antes de precisar redimensionar sua matriz interna (e não tem nada a ver com o número inicial de elementos na lista).

Para inicializar uma lista com 60 zeros, faça o seguinte:

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

Se você quiser criar uma lista com 60 objetos diferentes , poderá usar a API de Stream da Supplierseguinte maneira:

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());
aioobe
fonte
1
Isso é muito melhor que a minha solução (até a minha atualizada que realmente funciona hehehe). Eu recomendaria não fazer um novo ArrayListdisso, e simplesmente programar para List. Essa é uma decisão deixada para o OP, é claro.
corsiKa
6
A lista retornada por nCopiesé imutável, portanto, criar um novo ArrayListé provavelmente uma boa ideia.
aioobe
4
Lembre-se de que, ao usar o nCopiesobjeto complexo, a coleção não é instanciada com 60 objetos diferentes, mas 60 vezes com o mesmo objeto. Portanto, use isso apenas para primitivos.
membersound
1
@membersound, eu posso pensar em muitos cenários onde nCopiesé útil com tipos de referência: objetos imutáveis, como strings, padrões de objetos nulos, constantes enum, ... Enfim, atualizei a resposta com uma solução para criar 60 objetos diferentes.
precisa saber é
@aioobe Eu sei que existem muitos cenários em que o ncopies é útil. Eu só queria adicionar isso, pois tentei ncopies com objetos mutáveis ​​e fiquei surpreso que não funcionasse como eu esperava. Apenas no caso de alguém tentar a mesma tarefa. Obrigado pela atualização!
membersound
12
// 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);
corsiKa
fonte
2
Isso preenche apenas uma lista com entradas existentes. Não o inicializará com os elementos desejados.
WhiteFang34
Isso não preencherá a lista com 60 zeros.
aioobe
Mesmo se criaria 60 objetos onde não é necessário criar nenhum.
colind
1
@Frost: você obterá um IndexOutOfBoundsExceptioncomList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
WhiteFang34
2
Arrays.asListproduz um Listque não permite adicionar ou remover, portanto, não é exatamente o que o OP quer. Funcionaria se tudo o que você precisasse fazer é set, mas você pode ser melhor usar apenas uma matriz nesse caso.
colind
8

Os 60 que você está passando são apenas a capacidade inicial de armazenamento interno. É uma dica de quão grande você acha que pode ser, mas é claro que não é limitado por isso. Se você precisar predefinir valores, precisará defini-los, por exemplo:

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

Implementação do Java 8 (lista inicializada com 60zeros) :

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N] - cria uma matriz preenchida com zeros e comprimento N
  • boxed() - cada elemento encaixotado em um número inteiro
  • collect(Collectors.toList()) - coleta elementos do fluxo
am0wa
fonte
0

Não é desse jeito. ArrayList apenas usa matriz como respentação interna. Se você adicionar mais de 60 elementos, a matriz subjacente será expandida. No entanto, você pode adicionar tantos elementos a essa matriz quanto a RAM que você possui.

Marcin
fonte