我有一个应用程序在 scala.collection.immutable.Map 中使用相同的键进行连续查找,这会导致返回两个不同的引用。如下所示:
val v1 = m(key)
val v2 = m(key)
require(v1 eq v2) // fails!
我无法在一个小例子中重现这种行为,我想知道是否有任何情况可以合理/预期。该应用程序是单线程的,我通过一个接一个地进行查找来隔离问题。
我有一个应用程序在 scala.collection.immutable.Map 中使用相同的键进行连续查找,这会导致返回两个不同的引用。如下所示:
val v1 = m(key)
val v2 = m(key)
require(v1 eq v2) // fails!
我无法在一个小例子中重现这种行为,我想知道是否有任何情况可以合理/预期。该应用程序是单线程的,我通过一个接一个地进行查找来隔离问题。
您的地图是否有可能是不可变的,但您用于它的键是可变的或有不正确的hashcode
并且equals
实现返回不确定的结果?您使用的类型是什么?
REPL中过分夸张的例子:
scala> import scala.util.Random
import scala.util.Random
scala> class BadKey(val value: Int) {
| override def hashCode = Random.nextInt(Int.MaxValue)
|
| override def equals(x: Any) = Random.nextBoolean
| }
defined class BadKey
scala> val randMap = Map(new BadKey(1) -> 1, new BadKey(2) -> 2)
randMap: scala.collection.immutable.Map[BadKey,Int] = Map(BadKey@26132448 -> 1, BadKey@41e1cd27 -> 2)
scala> randMap.get(new BadKey(1))
res6: Option[Int] = Some(1)
scala> randMap.get(new BadKey(1))
res7: Option[Int] = Some(2)
scala> randMap.get(new BadKey(1))
res8: Option[Int] = Some(1)
scala> randMap.get(new BadKey(1))
res9: Option[Int] = Some(1)
scala> randMap.get(new BadKey(1))
res10: Option[Int] = Some(1)
scala> randMap.get(new BadKey(1))
res11: Option[Int] = None
我怀疑您正在测试参考相等性。在这种情况下,v1 和 v2 是不同的对象。除非您创建案例类,否则引用相等是类的默认设置。