Criar um ArrayList com tamanho já definido

Pessoa, boa noite!

Estou criando um arrayList - List lista = new LinkedList();
Pelo o que eu sei, o tamanho dessa lista será definido de forma dinâmica, ou seja conforme a inserção de um novo elemento nesta lista, porém gostaria de, “dar new” nesta lista já passando o tamanho da mesma. Tem como fazer isso?

Olha creio que não seja possível fazer isso, pois numca tive a necessidade de fazer isso com um ArrayList.

Já que você tem um tamanho pré-definido para sua lista. Creio que você não tem a necessidade de utilizar
somente ArrayList. Pode utilizar também um vetor já que é uma lista limitada.

vc pode usar assim

[code]int x = 3;

String[] list = new String[x];[/code]

Uma lista encadeada (LinkedList) vai crescer dinamicamente.
Em um ArrayList vc pode especificar o tamanho inicial usando o construtor que recebe um inteiro que indica essa capacidade.

List<String> lista = new ArrayList<String>(40); 

[]'s

[quote=brunobuild]vc pode usar assim

[code]int x = 3;

String[] list = new String[x];[/code][/quote]

:shock: :shock: :shock:

Isso é um array com tamanho resolvido dinamicamente, não uma lista.

Coloquei o valor fora para mostrar que pode ser qualquer valor.

A unica diferença, de um array dessa forma e de uma lista, é a forma como vc trabalha com ele, mas nesse caso vc consegue chegar no mesmo resultado. :lol:

[quote=davidbuzatto]Uma lista encadeada (LinkedList) vai crescer dinamicamente.
Em um ArrayList vc pode especificar o tamanho inicial usando o construtor que recebe um inteiro que indica essa capacidade.

List<String> lista = new ArrayList<String>(40); 

[]'s[/quote]

Apenas complementando. Uma lista pode ter várias implementações (o que varia a performance, como ficará na memória, etc.). No caso de um ArrayList, ele cria um array comum com aquele elemento (que eu saiba, inicialmente 10, se não tiver sido definido). Quando você vai adicionando, ele vai criando instâncias maiores de array e passando os dados atuais para esse. Essas adições que causam esse tipo de remanejamento dos dados geram perca na performance. Porém, essa organização em array faz com que os elementos fiquem contiguos na memória (fiquem todos juntos, ao invés de espalhados), o que dá maior desempenho na pesquisa (já que além de estarem contiguos, também podem ser recuperados facilmente pelo índice).
No caso da LinkedList, esses dados são colocados na forma de nós. Um nó liga ao próximo, formando uma linda ligada. Isso torna ela bem dinâmica, não precisando ficar realocando arrays na adição. Porém, são nós podem estar espalhados na memória, o que piora a pesquisa. Outro fator que piora a pesquisa é que não há algo que defina bem o índice de certo elemento. Então, para pegar o elemento de dado índice, a lista percorre do primeiro até o dado índice para encontrá-lo. Outra coisa que é péssimo com esse tipo de lista é fazer aquele for clássico: for(int i=0; i<lista.size(); i++), dando get(i). Isso se torna inviável em performance, pois toda vez vai percorrer tudo, como eu disse. Daí já é bem melhor usar Iterator ou for-each.

Voltando ao ArrayList, você pode passar por parâmetro um int que define o tamanho inicial do Array. No caso da LinkedList, pelos fatores que eu disse, isso é impossível. Dê preferência ao ArrayList em casos de listas que priorizem pesquisa e ao LinkedList em casos que se priorize a adição.

1 curtida

[quote=brunobuild]Coloquei o valor fora para mostrar que pode ser qualquer valor.

A unica diferença, de um array dessa forma e de uma lista, é a forma como vc trabalha com ele, mas nesse caso vc consegue chegar no mesmo resultado. :lol:
[/quote]

Se você precisar de mais espaço que o que você alocou inicialmente, você vai ter que recriar o array e passar os dados antigos. Dai você já começa a fazer, na mão, o que uma lista (ArrayList) faz por você. Ainda mais que essa lista já é otimizada para o compilador.

1 curtida

Na verdade depende do uso, se for por performance o Array(vetor) é sempre mais rapido, tanto na alocação da memória como pra recuperar, obviamente para iteragir o ArrayList é mais facil.

Cada caso é um caso.

:lol:

Só para voces entenderem o meu problema, estou fazendo uma exercicio, onde estou criando varias contas correntes em um while, dentro deste while estou sorteando uma posição que é a posição onde esta conta corrente deverá ser salva na minha lista, porém, a minha lista esta sendo criada com tamanho 0, e quando tento salvar a minha conta corrente, por exemplo na posição 5, a jvm apresenta uma exeção…

[color=red]Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 5, Size: 0
at java.util.ArrayList.add(Unknown Source)[/color]

Estou copiando o meu código abaixo:

            List<ContaPoupanca> lista = new ArrayList<ContaPoupanca>();
	
	Random random = new Random();
	int j = 0;
	int numero = 0;
	
	for(int i = 0; i < 10; i++) {
		j = random.nextInt(10);
		
		ContaPoupanca contaPoupanca = new ContaPoupanca(numero);
		
		lista.add(j, contaPoupanca);
		
		numero += 100;
	}

Não sei o que vc ta querendo fazer, mas isso que vc ta fazendo não funciona, pq a lista não está populada.

Não da pra vc colocar alguma coisa no index 5 se ele não existe.

Tenho uma solução, mas não sei se isso que vc quer.

    [code]public static void main(String[] args)
{
	List&lt;String&gt; lista = new ArrayList&lt;String&gt;();
	
	int numero = 0;

	for (int i = 1; i &lt; 10; i++)
	{			
		String contaPoupanca = String.valueOf(numero);

		lista.add(contaPoupanca);

		numero += 100;
	}
	
	System.out.println(lista.get(3));
}[/code]

Então, estou fazendo uma exercicio, onde estou criando varias contas correntes em um while, dentro deste while estou sorteando uma posição que é a posição onde esta conta corrente deverá ser salva na minha lista, porém, a minha lista esta sendo criada com tamanho 0, e quando tento salvar a minha conta corrente, por exemplo na posição 5, a jvm apresenta uma exeção…

Mude a lógica de seu código. Ao invés de sair adicionando direto na posição 5, adicione normal… depois adicione antes desse… depois adicione depois do outro… e assim vai. Ou, senão, use um array normal.

Existe duas maneiras de vc fazer isso.

Inicia a lista com valores default por exemplo “”

        public static void main(String[] args)
	{
		List&lt;String&gt; list = new ArrayList&lt;String&gt;();
		int numero = 0;
		
		for (int i = 0; i &lt; 10; i++)
		{
			list.add(&quot;&quot;);
		}
		
		for (int i = 0; i &lt; 10; i++)
		{
			String contaPoupanca = String.valueOf(numero);
			
			list.set((int)(Math.random() * 10), contaPoupanca);
			
			numero += 100;
		}
		
		System.out.println(&quot;Lista preenchida com o tamanho: &quot; + list.size());
		
		for (String element : list)
		{
			System.out.println(&quot;Elemento: &quot; + element);
		}
	}

Ou

        public static void main(String[] args)
	{
		int[] list = new int[10];
		int numero = 0;
		
		for (int i = 0; i &lt; 10; i++)
		{
			list[(int)(Math.random() * 10)] = numero;
			
			numero += 100;
		}
		
		System.out.println(&quot;Lista preenchida&quot;);
		
		for (int i : list)
		{
			System.out.println(&quot;Elemento: &quot; + i);
		}
	}