Vectors, Arrays, and Buffers
Prerequisites: Lists
Vector: the all-rounder
Vector is immutable like List, but fast for indexing and adding at
either end:
@main def vectors(): Unit =
val v = Vector(10, 20, 30)
println(v(2))
println(v :+ 40)
println(0 +: v)
println(v.updated(1, 99))
30
Vector(10, 20, 30, 40)
Vector(0, 10, 20, 30)
Vector(10, 99, 30)
List |
Vector |
|
|---|---|---|
| Add to front | very fast | fast |
| Add to end | slow | fast |
| Read by index | slow | fast |
| Best for | head/tail recursion, prepending | general use |
When in doubt, Vector is a good default for sequences.
Mutable collections
For performance-sensitive code or local building-up, mutable collections exist:
import scala.collection.mutable.ArrayBuffer
@main def mutableCollections(): Unit =
val buffer = ArrayBuffer(1, 2, 3)
buffer += 4
buffer -= 1
buffer(0) = 20
println(buffer)
println(buffer.toList)
val arr = Array(5, 3, 8)
arr(0) = 1
println(arr.mkString(", "))
println(arr.sorted.mkString(", "))
ArrayBuffer(20, 3, 4)
List(20, 3, 4)
1, 3, 8
1, 3, 8
ArrayBuffer— a growable, mutable sequence (like Java'sArrayList).Array— a fixed-size, mutable Java array. Printing an array directly shows an unreadable reference, so usemkString.
Keep mutable collections local (inside a method), and return an
immutable one (buffer.toList) to callers.