Skip to content
AgileLogics
4 min read

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's ArrayList).
  • Array — a fixed-size, mutable Java array. Printing an array directly shows an unreadable reference, so use mkString.

Keep mutable collections local (inside a method), and return an immutable one (buffer.toList) to callers.