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的结果进行比较?
我一直认为,因为他们来自不同的班级,所以他们在比较时是假的。有人可以解释一下,为什么这样实现呢?
答案 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)
List
和Buffer
都是scala.collection.Seq
。它们具有可以枚举的元素(可能是重复的)(即第一个元素,第二个元素等)。
一个是List
而另一个是Buffer
的事实只是一个实现细节。
更好的问题是scala.collection.immutable.Seq
和scala.collection.mutable.Seq
可以相等的原因,答案是可变性与它们的比较方式无关。