Respostas:
O Scala List
é uma estrutura de dados recursivos imutáveis, que é uma estrutura tão fundamental no Scala, que você (provavelmente) deve usá-lo muito mais do que um Array
(que é realmente mutável - o análogo imutável de Array
é IndexedSeq
).
Se você vem de um plano de fundo Java, o paralelo óbvio é quando usar LinkedList
novamente ArrayList
. O primeiro é geralmente usado para listas que apenas são percorridas (e cujo tamanho não é conhecido antecipadamente), enquanto o último deve ser usado para listas que possuem um tamanho conhecido (ou tamanho máximo) ou para as quais o acesso aleatório rápido é importante.
ListBuffer
fornece uma conversão de tempo constante para uma List
que é apenas uma razão para usar ListBuffer
se essa conversão posterior for necessária.
Um scala Array
deve ser implementado na JVM por uma matriz Java e, portanto, um Array[Int]
pode ter muito mais desempenho (como um int[]
) do que um List[Int]
(que exibirá seu conteúdo em caixa, a menos que você esteja usando as versões mais recentes do Scala que possuem o novo @specialized
recurso) .
No entanto, acho que o uso de Array
s no Scala deve ser reduzido ao mínimo, porque parece que você realmente precisa saber o que está acontecendo sob o capô para decidir se sua matriz será realmente apoiada pelo tipo primitivo necessário ou pode ser embalado como um tipo de invólucro.
Além das respostas já postadas, aqui estão alguns detalhes.
Enquanto an Array[A]
é literalmente uma matriz Java, a List[A]
é uma estrutura de dados imutável que é Nil
(a lista vazia) ou consiste em um par (A, List[A])
.
Diferenças de desempenho
Array List
Access the ith element θ(1) θ(i)
Delete the ith element θ(n) θ(i)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Count the elements θ(1) θ(n)
Diferenças de memória
Array List
Get the first i elements θ(i) θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Portanto, a menos que você precise de acesso aleatório rápido, precise contar elementos ou, por algum motivo, precise de atualizações destrutivas, a List
é melhor que uma Array
.
list = list.drop(i)
. Ou ocorre alguma mágica por trás do capô?
drop
nunca precisam copiar a parte da lista que não foi descartada. Por exemplo, (x::xs).drop(1)
é exatamente xs
, não uma "cópia" de xs
.
Uma matriz é mutável, o que significa que você pode alterar os valores de cada índice, enquanto uma lista (por padrão) é imutável, o que significa que uma nova lista é criada toda vez que você faz uma modificação. Na maioria dos casos, é um estilo mais "funcional" para trabalhar com tipos de dados imutáveis e você provavelmente deve tentar usar uma lista com construções como yield
, foreach
, match
e assim por diante.
Para características de desempenho, uma matriz é mais rápida com acesso aleatório a elementos, enquanto uma lista é mais rápida ao adicionar (adicionar) novos elementos. A iteração sobre eles é comparável.
iterate over
, por causa de cache