有人可以为我更深入地解释 Scala 中关于数组的 immutability/mutability 概念吗?

Can someone explain immutability/mutability concept in Scala regarding arrays in a little more depth for me?

我是 Scala 的新手,正在尝试理解与 Arrays 和 ArrayBuffers 相关的不变性概念 - 然而,我被这个概念绊倒了。

我理解 var 表示可变对象,val 表示不可变对象。

var i = 10
i = 12

//OR

val i = 10
i = 12 //error - reassignment to val

所以我有一个涉及数组和 ArrayBuffers 的示例,也许有人可以解释内存中到底发生了什么以及为什么允许这些操作发生。就像我说的,我对 Scala 还是个新手,我只是不确定为什么这些概念是:

def main(args: Array[String]) :Unit =
  {
    val testArr:Array[Int] = new Array[Int](3)
    testArr(0) = 1
    testArr(1) = 2
    testArr(2) = 3
    val testArr2:Array[Int] = new Array[Int](3)
    //testArr2 = Array(1,2,3) - reassignment to val


    val arrBuffer = new ArrayBuffer[Int]
    arrBuffer += 1
    arrBuffer += 2
    arrBuffer += 3
    //arrBuffer = ArrayBuffer[Int](4,5,6) - reassignment to val
    val addBuffer = ArrayBuffer[Int](4,5,6)
    arrBuffer ++= addBuffer
  }

内存模型区分指向数据的指针(内存地址)和指向数据(数据本身) .考虑

val x = Array(1,2,3)

关键是要明白x并不物理地保存数据1,2,3,而只是保存对实际数据的引用(指针),即它保存内存位置数据开始的位置。

对比以下情况

val xa = List(1,2,3)  // constant pointer to constant data
var xb = List(1,2,3)  // non-constant pointer to constant data
val ya = Array(1,2,3) // constant pointer to non-constant data
var yb = Array(1,2,3) // non-constant pointer to non-constant data

例如,yb意味着我们可以改变存储在yb中的地址以及yb指向的数据:

yb = ya    // mutating the pointer
yb(0) = 42 // mutating the pointed-to-data

理想情况下,我们争取 xa 用法,即指向常量数据的常量指针。在函数式编程中,当我们谈到不变性时,我们通常会想到这种xa情况。