Strange behaviour of the Array type with `==` operator

后端 未结 2 1874
暗喜
暗喜 2020-12-03 12:15
scala> List(1,2,3) == List(1,2,3)

res2: Boolean = true

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

res3: Boolean = true

But when

相关标签:
2条回答
  • 2020-12-03 12:22

    Because the definition of "equals" for Arrays is that they refer to the same array.

    This is consistent with Java's array equality, using Object.Equals, so it compares references.

    If you want to check pairwise elements, then use sameElements

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

    or deepEquals, which has been deprecated in 2.8, so instead use:

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

    There's a good Nabble discussion on array equality.

    0 讨论(0)
  • 2020-12-03 12:25

    The root cause the it is that fact that Scala use the same Array implementation as Java, and that's the only collection that not support == as equality operator.

    Also, it's important to note that the chosen answer suggest equally sameElements and deep comparison when actually it's preferred to use:

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

    Or, because now we can use == back again:

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

    Instead of:

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

    Because sameElements won't for for nested array, it's not recursive. And deep comparison will.

    0 讨论(0)
提交回复
热议问题