我正在阅读scaladocs,只是想知道直接赋值和.clone方法之间的区别。
val a=Array(1,2,3,4,5)
案例1:
val b=a
案例2:
val b=a.clone()
答案 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
时,a
和b
指向同一个对象。当对象发生变化时,两者都会看到变化。
另一方面,克隆数组时,会生成具有相同内容的新数组。更改此新阵列不会更改旧阵列。
答案 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不引用同一个对象。