为什么Buffer和List对象相等(即使它们来自不同的类)?

时间:2012-06-20 19:14:09

标签: list scala buffer equals

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的结果进行比较?

我一直认为,因为他们来自不同的班级,所以他们在比较时是假的。有人可以解释一下,为什么这样实现呢?

2 个答案:

答案 0 :(得分: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属于同一类别(序列),然后将相等定义为具有相同的元素。

答案 1 :(得分:3)

ListBuffer都是scala.collection.Seq。它们具有可以枚举的元素(可能是重复的)(即第一个元素,第二个元素等)。

一个是List而另一个是Buffer的事实只是一个实现细节。

更好的问题是scala.collection.immutable.Seqscala.collection.mutable.Seq可以相等的原因,答案是可变性与它们的比较方式无关。