scala:列表真的不可变吗?

时间:2011-12-12 20:41:06

标签: arrays list scala

在“Scala编程”中,声明列表是不可变的,并且数组是可变的。但是我不能改变数组长度 - 我也不能用list,所以这样它们都是不可变的。我可以更改数组的元素值 - 只需设置一个新的元素值,我可以用map方法修改列表的元素值。所以这样他们都是可变的。

那么为什么数组被认为是可变的并且没有列出?

3 个答案:

答案 0 :(得分:10)

首先,重要的是要知道Scala实际上同时具有可变和不可变的集合。如果您使用scala.collection.mutable.ListBuffer,它(如名称所示)将是可变的。如果您使用scala.collection.immutable.List则不会。

其次,map函数不会改变列表的元素,而是创建一个全新的列表,其中包含应用于起始列表的每个元素的map函数的结果,例如:

var l1 = List(1,3,5)
var l2 = l1.map( _ + 2 )
println(l1) // List(1, 3, 5)
println(l2) // List(2, 4, 6)

l2现在包含一个新列表,与l1完全分开,l1尚未更改。

答案 1 :(得分:3)

您无法转换List的元素 - 如果您使用转换元素的函数创建了一个新的List:

scala> val xs = List(1,2,3)
xs: List[Int] = List(1, 2, 3)

scala> xs.map(_+1)
res0: List[Int] = List(2, 3, 4)

scala> xs
res1: List[Int] = List(1, 2, 3)

相比之下,数组的元素是可变的:

scala> val xs = Array(1,2,3)
xs: Array[Int] = Array(1, 2, 3)

scala> xs(0) = 5

scala> xs
res3: Array[Int] = Array(5, 2, 3)

scala> val xs = List(1,2,3)
xs: List[Int] = List(1, 2, 3)

scala> xs(0) = 5
<console>:9: error: value update is not a member of List[Int]
              xs(0) = 5
              ^

尽管如此,您无法更改数组的大小。如果你想这样做,你必须使用scala.collection.mutable.Buffer

scala> val xs = Array(1,2,3)
xs: Array[Int] = Array(1, 2, 3)

scala> xs += 4
<console>:9: error: reassignment to val
              xs += 4
                 ^

scala> val xs = collection.mutable.Buffer(1,2,3)
xs: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)

scala> xs += 4
res6: xs.type = ArrayBuffer(1, 2, 3, 4)

答案 2 :(得分:1)

List的map方法将创建一个新列表。

如果你想使用一个可变的集合,请参阅    * scala.collection.mutable包。