我正在閱讀scaladocs,只是想知道直接分配和.clone方法之間的區別。val b = a(a是一個Array)和val b = a.clone()之間的區別是什麼?
val a=Array(1,2,3,4,5)
殼體1:
val b=a
殼體2:
val b=a.clone()
我正在閱讀scaladocs,只是想知道直接分配和.clone方法之間的區別。val b = a(a是一個Array)和val b = a.clone()之間的區別是什麼?
val a=Array(1,2,3,4,5)
殼體1:
val b=a
殼體2:
val b=a.clone()
考慮這樣的:
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中,而在第二種情況下,創建一新的對象都引用導致相同的對象和a和b不引用同一個對象。
我相信案例1只是設置了a的引用,而案例2創建了一個全新的數組,它是a的一個副本,並將值放入b中。
換句話說,如果你萬一編輯一個陣列B排列也將被編輯這不是案件的情況下2
這裏是代碼的答案:
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
很好的答案,Thx! –
謝謝你Mattias –