使用`==`运算符的Array类型的奇怪行为

时间:2010-07-09 14:07:17

标签: scala arrays equals equality

scala> List(1,2,3) == List(1,2,3)

res2: Boolean = true

scala> Map(1 -> "Olle") == Map(1 -> "Olle")

res3: Boolean = true

但是当尝试对Array执行相同操作时,它的工作方式不同。为什么呢?

scala> Array('a','b') == Array('a','b')

res4: Boolean = false

我使用过2.8.0.RC7和2.8.0.Beta1-prerelease。

2 个答案:

答案 0 :(得分:19)

因为Arrays的“等于”的定义是它们引用相同的数组。

这与使用Object.Equals的Java数组相等一致,因此它会比较引用。

如果要检查成对元素,请使用sameElements

Array('a','b').sameElements(Array('a','b'))

deepEquals,已在2.8中弃用,因此改为使用:

Array('a','b').deep.equals(Array('a','b').deep)

array equality上有一个很好的Nabble讨论。

答案 1 :(得分:0)

根本原因是 Scala 使用与 Java 相同的Array实现,这是唯一不支持==作为相等的集合操作

此外,重要的是要注意所选答案同样建议sameElementsdeep进行比较,实际上最好使用它:

Array('a','b').deep.equals(Array('a','b').deep)

或者,因为现在我们可以再次使用==

Array('a','b').deep == Array('a','b').deep

而不是:

Array('a','b').sameElements(Array('a','b'))

因为sameElements不适用于嵌套数组,所以它不是递归的。并deep进行比较。