Разница между массивом и списком в scala

В каких случаях я должен использовать Array (Buffer) и List (Buffer). Единственное отличие, которое я знаю, это то, что массивы невариантны, а списки ковариантны. Но как насчет производительности и некоторых других характеристик?

Ответы

Ответ 1

Неизменяемые структуры

Scala List - это неизменяемая рекурсивная структура данных, которая является такой фундаментальной структурой в Scala, что вы должны (вероятно) использовать ее гораздо больше, чем Array (которая на самом деле mutable - неизменный аналог Array равен IndexedSeq).

Если вы исходите из фона Java, то очевидной параллелью является использование LinkedList над ArrayList. Первый обычно используется для списков, которые только когда-либо пересекаются (и размер которых неизвестен заранее), в то время как последний должен использоваться для списков, которые либо имеют известный размер (или максимальный размер), либо для которого необходим быстрый случайный доступ.

Изменчивые структуры

ListBuffer обеспечивает постоянное преобразование в List, которое является основанием для использования ListBuffer, если требуется такое последующее преобразование.

A Scala Array должен быть реализован на JVM с помощью массива Java, и, следовательно, Array[Int] может быть намного более результативным (как int[]), чем a List[Int] (который будет включать его содержимое, если вы не используете самые последние версии Scala, у которых есть новая функция @specialized).

Однако я считаю, что использование Array в Scala должно быть сведено к минимуму, потому что кажется, что вам действительно нужно знать, что происходит под капотом, чтобы решить, будет ли ваш массив действительно поддерживаться требуемый примитивный тип, или может быть помещен в коробку как тип обертки.

Ответ 2

В дополнение к уже опубликованным ответам, вот некоторые особенности.

Хотя Array[A] является буквально массивом Java, List[A] - это неизменяемая структура данных, которая либо является Nil (пустой список), либо состоит из пары (A, List[A]).

Различия в производительности

                          Array  List
Access the ith element    O(1)   O(i)
Delete the ith element    O(n)   O(i)
Insert an element at i    O(n)   O(i)
Reverse                   O(n)   O(n)
Concatenate (length m,n)  O(n+m) O(n)
Count the elements        O(1)   O(n)

Различия в памяти

                          Array  List
Get the first i elements  O(i)   O(i)
Drop the first i elements O(n-i) O(1)
Insert an element at i    O(n)   O(i)
Reverse                   O(n)   O(n)
Concatenate (length m,n)  O(n+m) O(n)

Поэтому, если вам не нужен быстрый случайный доступ или необходимость подсчета элементов, List лучше, чем Array.

Ответ 3

Array изменен, что означает, что вы можете изменять значения каждого индекса, тогда как список (по умолчанию) является неизменным, что означает, что новый список создается каждый раз, когда вы делаете модификацию. В большинстве случаев это более "функциональный" стиль для работы с неизменяемыми типами данных, и вам следует, вероятно, попробовать использовать List с конструкциями типа yield, foreach, match и т.д.

Для характеристик производительности массив быстрее со случайным доступом к элементам, тогда как список быстрее при добавлении (добавлении) новых элементов. Итерация по ним сопоставима.