2012-06-20 55 views
7
scala> import scala.collection.mutable.Buffer 
import scala.collection.mutable.Buffer 

scala> val b = Buffer(1, 2, 3) 
b: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3) 

scala> val l = List(1, 2, 3) 
l: List[Int] = List(1, 2, 3) 

scala> b == l 
res1: Boolean = true 

我想知道,爲什麼Buffer和List對象可以與true的結果進行比較?爲什麼Buffer和List對象相等(即使它們來自不同的類)?

我一直以爲,那是因爲他們來自不同的班級,他們比較是假的。有人可以解釋我,爲什麼這樣實施?

回答

17

http://www.scala-lang.org/docu/files/collections-api/collections_41.html

收集圖書館有一個統一的方法,以平等和散列。這個想法首先是將集合分爲集合,地圖和序列。不同類別的集合總是不相等的。例如,Set(1,2,3)與List(1,2,3)不相等,即使它們包含相同的元素。另一方面,在同一類別中,只有當它們具有相同的元素(對於序列:同一個元素中的元素相同)時,集合纔是相等的。例如,List(1,2,3)== Vector(1,2,3)和HashSet(1,2)== Treeset(2,1)。

檢查集合是否可變或不可變是否相等。 (...)

所以這是因爲scala.collection.mutable.Buffer和List屬於相同的類別(序列),然後將相等性定義爲具有相同的元素。

+2

除了'List(1,2,3)== Array(1,2,3)'返回'false'! Array是一種特殊情況,因爲'Array'上的'=='方法是本地Java方法,它不遵循整個Scala集合邏輯。另外,在你指向的鏈接中,文本現在說'List(1,2,3)== Vector(1,2,3)'。我編輯了你的答案來解決這個問題。 – ebruchez

3

ListBuffer都是scala.collection.Seq。它們具有可能重複的元素,可以枚舉(即第一個元素,第二個元素等)。

其中一個是List而另一個Buffer只是一個實現細節。

一個更好的問題將是爲什麼scala.collection.immutable.Seqscala.collection.mutable.Seq可以相等,並且答案是可變性與它們如何比較無關。

+0

感謝您的額外信息! –

相關問題