Scala不可变映射为同一个键返回不同的值

时间:2013-10-08 23:29:41

标签: scala map reference immutability

我在scala.collection.immutable.Map中有一个连续查找的应用程序,使用相同的键,这会导致返回两个不同的引用。如下所示:

val v1 = m(key)
val v2 = m(key)
require(v1 eq v2) // fails!

我无法在一个小例子中重现这种行为,我想知道是否存在任何合理/预期的情况。该应用程序是单线程的,我通过让查找恰好相互发生来隔离问题。

2 个答案:

答案 0 :(得分:1)

我怀疑你正在测试引用相等性。在这种情况下,v1和v2是不同的对象。除非您创建案例类,否则引用相等性是类的默认值。

答案 1 :(得分:1)

您的地图是否可能是不可变的,但您使用的密钥是可变的,还是有不正确的hashcodeequals实现会返回非确定性结果?你使用的是哪种类型?

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