Algumas das declarações aqui são confusas ou até erradas, especialmente a ideia de que é imutável. O vetor em Scala é semelhante a um ArrayList. List e Vector são estruturas de dados imutáveis e persistentes (isto é, "baratas para obter uma cópia modificada"). Não existe uma opção padrão razoável, como pode ser para estruturas de dados mutáveis, mas depende do que o seu algoritmo está fazendo. List é uma lista vinculada individualmente, enquanto Vector é um número inteiro de base 32, ou seja, é um tipo de árvore de pesquisa com nós de grau 32. Usando essa estrutura, o Vector pode fornecer operações mais comuns razoavelmente rápidas, ou seja, em O (log_32 ( n)). Isso funciona para pré-acrescentar, acrescentar, atualizar, acesso aleatório, decomposição na cabeça / cauda. A iteração em ordem seqüencial é linear. A lista, por outro lado, apenas fornece iteração linear e pré-tempo constante, decomposição na cabeça / cauda.
Pode parecer que o vetor substitui a lista em quase todos os casos, mas o prefixo, a decomposição e a iteração são frequentemente as operações cruciais nas seqüências de um programa funcional, e as constantes dessas operações são (muito) maiores para o vetor devido a à sua estrutura mais complicada. Fiz algumas medições, para que a iteração seja cerca de duas vezes mais rápida para a lista, o prefixo é cerca de 100 vezes mais rápido nas listas, a decomposição na cabeça / cauda é cerca de 10 vezes mais rápida nas listas e a geração de um traversable é cerca de 2 vezes mais rápida para vetores. (Provavelmente, porque o Vector pode alocar matrizes de 32 elementos ao mesmo tempo quando você o cria usando um construtor, em vez de acrescentar ou acrescentar elementos um por um).
Então, qual estrutura de dados devemos usar? Basicamente, existem quatro casos comuns:
- Nós só precisamos transformar sequências por operações como mapear, filtrar, dobrar, etc: basicamente, não importa, devemos programar nosso algoritmo genericamente e até nos beneficiar da aceitação de sequências paralelas. Para operações seqüenciais, a lista é provavelmente um pouco mais rápida. Mas você deve compará-lo se precisar otimizar.
- Precisamos de muito acesso aleatório e atualizações diferentes, portanto devemos usar o vetor, a lista será proibitivamente lenta.
- Operamos em listas de uma maneira funcional clássica, construindo-as pré-anexando e iterando por decomposição recursiva: lista de uso, o vetor será mais lento por um fator de 10 a 100 ou mais.
- Temos um algoritmo de desempenho crítico que é basicamente imperativo e faz muito acesso aleatório em uma lista, algo como uma classificação rápida no local: use uma estrutura de dados imperativa, por exemplo, ArrayBuffer, localmente e copie seus dados de e para ele.
List<String> l = new ArrayList<String>()
blogs Scala de gravação , para que você acreditasse que todo mundo usa a List para obter uma qualidade persistente da coleção - mas o Vector é de uso geral o suficiente para usá-lo no lugar da List?