В чем разница между val b = a (a является массивом) и val b = a.clone ()? - PullRequest
2 голосов
/ 01 сентября 2011

Я читаю скалярные документы и просто удивляюсь разнице между прямым назначением и методом .clone.

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

дело 1:

val b=a

дело 2:

val b=a.clone()

Ответы [ 4 ]

13 голосов
/ 02 сентября 2011

Учтите это:

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 указывают на один и тот же объект. Когда объект изменяется, изменение будет видно обоим.

С другой стороны, когда вы клонируете массив, вы создаете новый массив с тем же содержимым. Изменение этого нового массива не меняет старый.

5 голосов
/ 02 сентября 2011

Я считаю, что случай 1 просто устанавливает ссылку a на b, а случай 2 создает совершенно новый массив, который является копией a и помещает значение в b.

Другими словами, если вы в случае a редактируете массив a, массив b также будет редактироваться, это не так в случае 2

3 голосов
/ 02 сентября 2011

Вот ответ в коде:

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
2 голосов
/ 02 сентября 2011

В случае 1 обе ссылки ведут к одному и тому же объекту, тогда как во втором случае создается новый объект, а a и b не ссылаются на один и тот же объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...