我有一个对象,用于存储特定实例的信息。为此,我想使用 Map
,但是键不是按引用传递的(对吧?),而是由 getHashCode
方法提供的哈希值。为了更好的理解:
import collection.mutable._
import java.util.Random
object Foo {
var myMap = HashMap[AnyRef, Int]()
def doSomething(ar: AnyRef): Int = {
myMap.get(ar) match {
case Some(x) => x
case None => {
myMap += ar -> new Random().nextInt()
doSomething(ar)
}
}
}
}
object Main {
def main(args: Array[String]) {
case class ExampleClass(x: String);
val o1 = ExampleClass("test1")
val o2 = ExampleClass("test1")
println(o2 == o1) // true
println(o2 eq o1) // false
// I want the following two lines to yield different numbers
// and i do not have control over the classes, messing with their
// equals implementation is not possible.
println(Foo.doSomething(o1))
println(Foo.doSomething(o2))
}
}
在存在哈希码相同的实例的情况下,“缓存”随机值将为两个实例返回相同的值,即使它们不相同。在这种情况下,应该使用哪种数据结构最好? 澄清/编辑 我知道通常是根据
hashCode
和equals
方法来确定的。但这正是我想避免的。我更新了我的示例以使其更清晰。 :)