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
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.