克隆后,原始数组的元素仍然被修改

时间:2017-06-15 17:21:23

标签: scala

我有以下代码:

val copyA = a.clone
copyA(0)(0) = 1
println("a(0)(0): " + a(0)(0))

打印:

a(0)(0): 1

如果我将其更改为:

val copyA = a.clone
println("a(0)(0): " + a(0)(0))

打印:

a(0)(0): 0

那么为什么a会因copyA的变化而受到影响?

如何才能使copyA中的更改不影响a

2 个答案:

答案 0 :(得分:3)

变异克隆的1D数组实例不会更改原始实例,反之亦然,

例如,

AvgLife

变异scala> val original = Array(100, 200) original: Array[Int] = Array(100, 200) scala> val cloned = original.clone cloned: Array[Int] = Array(100, 200) 数组不会影响cloned数组,

original

变异scala> cloned(0) = 5000 scala> original(0) //still the same value res36: Int = 100 数组不会影响original数组,

cloned

但它与2D数组有所不同,因为里面的每个数组都是一个ref并且必须进行深度克隆

scala> original(0) = 8888

scala> cloned(0) // still the same
res38: Int = 5000

深度克隆2D数组

scala> val original = Array.ofDim[Int](2,2)
original: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))

scala> original.foreach {col => println(col)}
[I@745e24c4
[I@42c6563f

答案 1 :(得分:2)

你克隆了数组。你没有克隆 in 数组中的任何内容。

在您的代码中,您没有操纵数组。您正在从数组中获取一个元素并操纵该对象。这里的数组完全不相关。