Parece que arraylist
nã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?
java
collections
geada
fonte
fonte
Respostas:
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:
Se você quiser criar uma lista com 60 objetos diferentes , poderá usar a API de Stream da
Supplier
seguinte maneira:fonte
ArrayList
disso, e simplesmente programar paraList
. Essa é uma decisão deixada para o OP, é claro.nCopies
é imutável, portanto, criar um novoArrayList
é provavelmente uma boa ideia.nCopies
objeto complexo, a coleção não é instanciada com 60 objetos diferentes, mas 60 vezes com o mesmo objeto. Portanto, use isso apenas para primitivos.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.fonte
IndexOutOfBoundsException
comList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
Arrays.asList
produz umList
que 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.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:
fonte
Implementação do Java 8 (lista inicializada com
60
zeros) :new int[N]
- cria uma matriz preenchida com zeros e comprimento Nboxed()
- cada elemento encaixotado em um número inteirocollect(Collectors.toList())
- coleta elementos do fluxofonte
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.
fonte