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

我一直在想,因为他们来自不同的阶层,所以比较起来一定是假的。有人可以解释一下,为什么要这样实现?

4

2 回答 2

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

于 2012-06-20T19:23:17.173 回答
3

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

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

一个更好的问题是为什么 ascala.collection.immutable.Seq和 ascala.collection.mutable.Seq可以相等,答案是可变性与它们的比较方式无关。

于 2012-06-20T19:36:27.333 回答