ArraySeq
Списки очень эффективны в алгоритмах которые активно использует head
.
Получение, добавление и удаление к переднему (head
) элементу списка занимает постоянное время,
в то время как доступ или изменение остальных элементов в списке занимает линейное время.
Последовательный массив (ArraySeq) - это тип коллекции, который решает проблему неэффективности случайного доступа к спискам.
ArraySeq
позволяют получить доступ к любому элементу коллекции за постоянное время,
из-за чего проще создавать эффективные алгоритмы.
ArraySeq
-ы создаются и изменяются также, как и любые другие последовательности.
val arr = scala.collection.immutable.ArraySeq(1, 2, 3)
// arr: ArraySeq[Int] = ArraySeq(1, 2, 3)
val arr2 = arr :+ 4
// arr2: ArraySeq[Int] = ArraySeq(1, 2, 3, 4)
arr2(0)
// res0: Int = 1
ArraySeq
-ы являются immutable, поэтому нельзя изменять элементы непосредственно в коллекции.
Однако операции updated
, appended
и prepended
создают новые ArraySeq
-ы,
которые отличаются от базового ArraySeq
только в одном элементе:
arr.updated(2, 4)
// res1: ArraySeq[Int] = ArraySeq(1, 2, 4)
arr
// res2: ArraySeq[Int] = ArraySeq(1, 2, 3)
Как видно из последней строки выше, вызов updated
не влияет на исходный ArraySeq
arr
.
ArraySeq
-ы хранят свои элементы в приватном массиве.
Таким образом достигается компактное представление и обеспечивается быстрый индексированный доступ к элементам,
но обновление или добавление одного элемента занимает линейное время,
так как требует создания другого массива и копирования всех элементов исходного.
Ссылки: