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

oll*_*erg 10 arrays scala equality equals

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

res2: Boolean = true

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

res3: Boolean = true
Run Code Online (Sandbox Code Playgroud)

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

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

res4: Boolean = false
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*hen 19

因为Arrays的"等于"的定义是它们引用相同的数组.

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

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

Array('a','b').sameElements(Array('a','b'))
Run Code Online (Sandbox Code Playgroud)

或者deepEquals,已经在2.8中弃用,所以改为使用:

Array('a','b').deep.equals(Array('a','b').deep)
Run Code Online (Sandbox Code Playgroud)

有关数组相等性的 Nabble讨论很好.

  • @olle:java数组_is_一个对象(http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html,特别是第10.8节)`WrappedArray`将java数组包装在一个类中.`Array` _is_ java数组.它不能覆盖`Object.equals`(并提供专门的equals)的原因是因为它不是java数组的子类.如果它包装数组或子类化它,它将表现如你所愿.要说,我的回答是完全准确的,除了没有详细介绍_why_它不能覆盖行为. (5认同)
  • 另见http://stackoverflow.com/questions/2481149/why-does-array0-1-2-array0-1-2-not-return-the-expected-result (3认同)
  • Array是比较内置集合的实际元素的一般规则的唯一例外吗?我尝试过的所有其他系列都比较了元素. (2认同)
  • @olle - 据我所知,它是展示这种行为的唯一集合.甚至`ArrayList`也会比较元素.我无法弄清楚的是,应该如何从文档中学习:) (2认同)