2010-07-09 3 views
9
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-preerelease.

+1

Примечание: вы можете искать все связанные с scala массивные вопросы с помощью [scala] [array] – oluies

+0

возможного дубликата [Почему Array (0,1,2) == Array (0,1,2) \ ' не возвращать ожидаемый результат?] (http://stackoverflow.com/questions/2481149/why-does-array0-1-2-array0-1-2-not-return-the-expected-result) – Suma

ответ

17

Поскольку определение «равно» для массивов состоит в том, что они относятся к одному и тому же массиву.

Это согласуется с равенством массива Java, используя Object.Equals, поэтому оно сравнивает ссылки.

Если вы хотите проверить попарные элементы, а затем использовать sameElements

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

или deepEquals, которое было устаревшее в 2.8, так что вместо этого использовать:

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

Там хорошая Nabble обсуждение array equality ,

+2

Является ли Array только исключение из общего правила сравнения фактических элементов для встроенных коллекций? Все остальные коллекции, которые я пробовал, сравнивают с элементами. –

+2

@olle - насколько я знаю, это единственная коллекция, которая демонстрирует такое поведение. Даже 'ArrayList' сравнивает элементы. То, что я не могу понять, заключается в том, как это должно быть изучено в документации: – Stephen

+3

также см. Http://stackoverflow.com/questions/2481149/why-does-array0-1-2-array0-1- 2-not-return-the-expected-result – oluies

Смежные вопросы