Em quais casos eu devo usar Array (Buffer) e List (Buffer). Apenas uma diferença que eu sei é que as matrizes não são variantes e as listas são covariantes. Mas e o desempenho e algumas outras características?
fonte
Em quais casos eu devo usar Array (Buffer) e List (Buffer). Apenas uma diferença que eu sei é que as matrizes não são variantes e as listas são covariantes. Mas e o desempenho e algumas outras características?
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, aList[A]
é uma estrutura de dados imutável que éNil
(a lista vazia) ou consiste em um par(A, List[A])
.Diferenças de desempenho
Diferenças de memória
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 umaArray
.fonte
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)
é exatamentexs
, não uma "cópia" dexs
.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.
fonte
iterate over
, por causa de cache