Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't Array's == function return true for Array(1,2) == Array(1,2)?

Tags:

In Programming in Scala the authors write that Scala's == function compares value equality instead of reference equality.

This works as expected on lists:

scala> List(1,2) == List(1,2) res0: Boolean = true 

It doesn't however work on arrays:

scala> Array(1,2) == Array(1,2) res1: Boolean = false 

The authors recommend to use the sameElements function instead:

scala> Array(1,2).sameElements(Array(1,2)) res2: Boolean = true 

As an explanation they write:

While this may seem like an inconsistency, encouraging an explicit test of the equality of two mutable data structures is a conservative approach on the part of the language designers. In the long run, it should save you from unexpected results in your conditionals.

  1. What does this mean? What kind of unexpected results are they talking about? What else could I expect from an array comparison than to return true if the arrays contain the same elements in the same position? Why does the equals function work on List but not on Array?

  2. How can I make the equals function work on arrays?

like image 688
Stefan Schmidt Avatar asked Sep 17 '10 17:09

Stefan Schmidt


People also ask

Are arrays equal JavaScript?

We are required to write a JavaScript function that takes in two arrays of Numbers, say first and second and checks for their equality. The arrays are equal if they contain the same elements irrespective of their order. If the sum of all the elements of the first array and second array is equal.


2 Answers

It is true that the explanation offered in the book is questionable, but to be fair it was more believable when they wrote it. It's still true in 2.8, but we have to retrofit different reasoning because as you've noticed, all the other collections do element comparisons even if they're mutable.

A lot of blood had been shed trying to make Arrays seem like the rest of the collections, but this was a tremendously leaky abstraction and in the end it was impossible. It was determined, correctly I think, that we should go to the other extreme and supply native arrays the way they are, using implicit machinery to enhance their capabilities. Where this most noticeably falls down is toString and equals, because neither of them behaves in a reasonable fashion on Arrays, but we cannot intercept those calls with implicit conversions because they are defined on java.lang.Object. (Conversions only happen when an expression doesn't type check, and those always type check.)

So you can pick your explanation, but in the end arrays are treated fundamentally differently by the underlying architecture and there's no way to paper over that without paying a price somewhere. It's not a terrible situation, but it is something you have to be aware of.

like image 176
psp Avatar answered Oct 22 '22 10:10

psp


This exact question has been voiced many times (by myself too, see Strange behaviour of the Array type ).

Note that it is ONLY the Array collection that does not support ==, all other collections do. The root cause is that Array IS the Java array.

like image 26
olle kullberg Avatar answered Oct 22 '22 08:10

olle kullberg