val b = a(a是数组)和val b = a.clone()之间有什么区别?

时间:2011-09-01 19:58:18

标签: scala reference

我正在阅读scaladocs,只是想知道直接赋值和.clone方法之间的区别。

val a=Array(1,2,3,4,5)

案例1:

val b=a

案例2:

val b=a.clone()

4 个答案:

答案 0 :(得分:13)

考虑一下:

scala> val a=Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)

scala> val b = a
b: Array[Int] = Array(1, 2, 3, 4, 5)

scala> val c = a.clone()
c: Array[Int] = Array(1, 2, 3, 4, 5)

scala> b(0) = 0

scala> c(1) = 1

scala> a
res2: Array[Int] = Array(0, 2, 3, 4, 5)

scala> b
res3: Array[Int] = Array(0, 2, 3, 4, 5)

scala> c
res4: Array[Int] = Array(1, 1, 3, 4, 5)

如您所见,当您执行val b = a时,ab指向同一个对象。当对象发生变化时,两者都会看到变化。

另一方面,克隆数组时,会生成具有相同内容的新数组。更改此新阵列不会更改旧阵列。

答案 1 :(得分:5)

我认为案例1只是将a的引用设置为b,而案例2创建了一个全新的数组,它是a的副本并将值放入b中。

换句话说,如果你编辑一个数组,那么b数组也将被编辑,情况2就不是这样了

答案 2 :(得分:3)

以下是代码中的答案:

scala> val a = Array(1,2,3,4,5)
scala> a.hashCode()
res12: Int = 1382155266

scala> val b = a
scala> b.hashCode()
res13: Int = 1382155266

scala> val c = a.clone()
scala> c.hashCode()
res14: Int = 2062756135

scala> a eq b
res15: Boolean = true

scala> a eq c
res16: Boolean = false

scala> b eq c
res17: Boolean = false

答案 3 :(得分:2)

在案例1中,两个引用都指向同一个对象,而在第二种情况下,创建一个新对象,而a和b不引用同一个对象。