Você pode definir o tamanho inicial de um ArrayList fazendo
ArrayList<Integer> arr=new ArrayList<Integer>(10);
No entanto, você não pode fazer
arr.add(5, 10);
porque causa uma exceção fora dos limites.
Qual é a utilidade de definir um tamanho inicial se você não pode acessar o espaço alocado?
A função add é definida add(int index, Object element)
assim, não estou adicionando ao índice 10.
set/add
item n-1 .ArrayList
. Eu, pessoalmente, gostaria de um método que me permitisse definir um tamanho para que eu pudesse colocar as coisas em índices específicos. Este método parece notavelmente ausente.Respostas:
Você está confundindo o tamanho da lista de matrizes com sua capacidade:
Quando você liga
new ArrayList<Integer>(10)
, está definindo a capacidade inicial da lista , não o tamanho. Em outras palavras, quando construída dessa maneira, a lista de matrizes inicia sua vida vazia.Uma maneira de adicionar dez elementos à lista de matrizes é usando um loop:
Feito isso, agora você pode modificar elementos nos índices 0..9.
fonte
while(arr.size() < 10) arr.add(0);
Pode ser útil dizer que o tamanho precisa ser pelo menos10
. por exemplo, de modo que você pode usararr.set(9, n);
Se você deseja uma lista com um tamanho predefinido, também pode usar:
fonte
List
é cheio de nulos. Com o Guava, podemos fazer oInts.asList(new int[10])
que inicializará nossa lista com0
s. Padrão limpo, obrigado pelo exemplo.ArrayList
é uma implementação daList
interface eArrays.asList
retorna umArrayList
. Eu sugiro que você procure polimorfismo.UnsupportedOperationException
se você deseja usar Collections.fill (list, obj); para preencher a lista com um objeto repetido, alternativamente, você pode usar
a linha copia 10 vezes 0 na sua ArrayList
fonte
A capacidade de um
ArrayList
não é igual ao seu tamanho . Tamanho é igual ao número de elementos contidos noArrayList
(e em qualquer outroList
implementação).A capacidade é apenas o comprimento da matriz subjacente, usada para armazenar internamente os elementos da
ArrayList
, e é sempre maior ou igual ao tamanho da lista.Ao chamar
set(index, element)
a lista, issoindex
se refere ao número real dos elementos da lista (= tamanho) (que é zero no seu código, portanto,AIOOBE
é lançado), não ao comprimento da matriz (= capacidade) (que é um detalhe específico da implementação para oArrayList
).O
set
método é comum a todas asList
implementações, comoLinkedList
, que na verdade não é implementado por uma matriz, mas como uma cadeia de entradas vinculada.Edit : Você realmente usa o
add(index, element)
método, nãoset(index, element)
, mas o princípio é o mesmo aqui.fonte
Se você deseja adicionar os elementos com o índice, você pode usar uma matriz.
fonte
10 é a capacidade inicial do AL, não o tamanho (que é 0). Você deve mencionar a capacidade inicial com algum valor alto quando tiver muitos elementos, pois evita a sobrecarga de expandir a capacidade à medida que continua adicionando elementos.
fonte
Eu acho que uma resposta exata para sua pergunta seria:
Definir um tamanho inicial em um ArrayList reduz o número. vezes a realocação da memória interna deve ocorrer. A lista é apoiada por uma matriz. Se você especificar, ou seja, a capacidade inicial 0, já na primeira inserção de um elemento, a matriz interna deverá ser redimensionada. Se você tiver uma idéia aproximada de quantos elementos sua lista conteria, definir a capacidade inicial reduziria o número. de realocações de memória acontecendo enquanto você usa a lista.
fonte
Isso pode ajudar alguém -
fonte
Chegando atrasado, mas após o Java 8 , pessoalmente, considero esta abordagem a seguir com a
Stream
API mais concisa e pode ser uma alternativa à resposta aceita .Por exemplo,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
onde
size
é oList
tamanho desejado e sem a desvantagem mencionada aqui , todos os elementos noList
são inicializados como0
.(Fiz uma pesquisa rápida e não encontrei
stream
nenhuma resposta postada. Fique à vontade para me informar se essa resposta é redundante e posso removê-la)fonte
No momento, não há elementos na sua lista, portanto você não pode adicionar ao índice 5 da lista quando ela não existir. Você está confundindo a capacidade da lista com seu tamanho atual.
Apenas ligue:
para adicionar o número inteiro ao seu ArrayList
fonte
Embora sua lista de matrizes tenha capacidade para 10, a lista real não possui elementos aqui. O método add é usado para inserir um elemento na lista real. Como ele não possui elementos, não é possível inserir um elemento no índice 5.
fonte
Se você deseja adicionar 10 itens ao seu,
ArrayList
tente:Se você já declarou uma variável de tamanho de matriz, usaria a variável em
size
vez do número '10'fonte
Enfrentei o problema semelhante e, sabendo que o arrayList é uma implementação redimensionável da interface List, também espero que você possa adicionar elemento a qualquer ponto, mas pelo menos ter a opção de definir o tamanho inicial. De qualquer forma, você pode criar uma matriz primeiro e convertê-la em uma lista como:
ou
fonte
ArrayList myList = new ArrayList (10);
/ * Declare que o capasity inicial do arraylist não é nada além de poupar tempo de mudança internamente; quando adicionamos o elemento internamente, ele verifica a capasidade para aumentar a capasidade, você pode adicionar o elemento no índice 0 inicialmente, depois 1 e assim por diante. * /
fonte
Meus dois centavos
Stream
. Acho melhor usarcom a flexibilidade de colocar quaisquer valores iniciais.
fonte