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

Значение «this» зависит от «контекста», в котором выполняется функция. Контекстом может быть любой объект или глобальный объект, т. Е. Окно.

Таким образом, семантика «этого» отличается от традиционных языков ООП. И это вызывает проблемы: 1. когда функция передается другой переменной (скорее всего, обратный вызов); и 2. когда замыкание вызывается из метода-члена класса.

В обоих случаях это устанавливается в окно.

126
задан Eugene Yokota 15 December 2010 в 22:38
поделиться

3 ответа

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

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

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

Изменяемые структуры

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

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

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

147
ответ дан 24 November 2019 в 00:30
поделиться

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

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

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

                          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)

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

                          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)

Поэтому, если вам не нужен быстрый произвольный доступ, нужно подсчитывать элементы или по какой-то причине вам нужны деструктивные обновления, список лучше, чем Массив .

128
ответ дан 24 November 2019 в 00:30
поделиться

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

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

17
ответ дан 24 November 2019 в 00:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: