考虑以下代码:
def timed[T](fn: => T): (T, Long) = {
val startTime = System.currentTimeMillis()
val result = fn
val endTime = System.currentTimeMillis()
(result, endTime - startTime)
}
val t1 = timed((0 until Int.MaxValue).hashCode())
val t2 = timed((0, Int.MaxValue).hashCode())
print(t1 + " : " + t2)
从理论上讲,Range的hashCode()的速度可以与Tuple相提并论,相反,速度的差异令人震惊:
(201341306,5274) : (-281813831,0)
事实证明,Range继承了IndexSeq的hashCode()实现,该实现需要完整的迭代。我的问题是,是否可以使其更快?是什么导致它无法实施?
答案 0 :(得分:2)
在scala标准库中,如果所有顺序集合的内容相等,则将其视为equal
。
Vector(1,2,3) == List(1,2,3) //true
由于equals
/ hashcode
合约的哈希码必须对每种类型的集合进行相同的计算。