在什么情况下我应该使用Array(Buffer)和List(Buffer).我所知道的唯一区别是数组是非变量的,列表是协变的.但是性能和其他一些特性呢?
据我所知,Scala ==定义了两个对象的自然相等.
我期望Array(0,1,2) == Array(0,1,2)比较自然平等.例如,与另一个数组的相应元素进行比较时,检查数组的所有元素是否返回true.
人们告诉我,Scala Array只是一个[]只比较身份的Java .改写覆盖比较自然平等Array的equals方法不是更有意义吗?
在Scala编程中,作者写道Scala的==函数比较值相等而不是引用相等.
这在列表上按预期工作:
scala> List(1,2) == List(1,2)
res0: Boolean = true
Run Code Online (Sandbox Code Playgroud)
但它不适用于数组:
scala> Array(1,2) == Array(1,2)
res1: Boolean = false
Run Code Online (Sandbox Code Playgroud)
作者建议使用sameElements函数:
scala> Array(1,2).sameElements(Array(1,2))
res2: Boolean = true
Run Code Online (Sandbox Code Playgroud)
作为解释,他们写道:
虽然这看似不一致,但鼓励对两个可变数据结构的相等性进行明确测试是语言设计者的保守方法.从长远来看,它可以帮助您避免条件下的意外结果.
这是什么意思?他们在谈论什么样的意外结果?如果数组在相同位置包含相同的元素,那么我还能从数组比较中得到什么呢?为什么equals函数可以工作List但不能工作Array?
如何使equals函数在数组上起作用?
在审查代码更改时,我发现Array.empty并不是Array()说我会考虑更多的惯用语.然后我惊讶地发现==他们给出false了他们看起来相同的类型和价值方面.
scala> Array.empty == Array()
res1: Boolean = false
scala> Array.empty
res2: Array[Nothing] = Array()
scala> Array()
res3: Array[Nothing] = Array()
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么会这样?