Scala对象的唯一ID

时间:2014-06-05 12:22:17

标签: scala object

在Python中,id(x)给出了对象x的唯一id。什么是Scala中的等价?

>>> id(True)
1166096
>>> id(False)
1166108
>>> x = id([1,2,3])
>>> id(x)
2058589988
>>> y = id([1,2,3])
>>> id(y)
2058589976

我可以使用x.hashCode作为id,但是当内容相同时它将返回相同的值。我想知道以下代码中的a eq b == false是什么。在a eq b

中比较了哪些值
scala> val a = ArrayBuffer(1,2,3)
a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

scala> val b = ArrayBuffer(1,2,3)
b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

scala> a.hashCode
res44: Int = 387518613

scala> b.hashCode
res45: Int = 387518613

scala> a eq b
res39: Boolean = false

2 个答案:

答案 0 :(得分:6)

不可能这样做。您需要自己生成并跟踪ID。

eq比较引用,类似于Java中的==

System.identityHashCode(这是Any.hashCode的默认实现)但不保证是唯一的。

您可以使用JNI实现id,但由于可能需要压缩GC,因此可能并不简单。但是,我对JNI了解不多。

即便如此,我也没有看到id是一项有用的功能,我也没有看到任何使用它。如果需要对对象的引用,请存储引用。如果您需要弱引用,请使用java.lang.ref.WeakReference[T]

答案 1 :(得分:2)

  

我可以使用x.hashCode作为id,但它将返回相同的值   当内容相同时。

首先:不。根据文档:"默认的散列算法取决于平台。"所以不要对hashCode做任何假设。

第二:eq比较参考。根据文档:"测试参数(arg0)是否是对接收者对象(this)的引用。"

第三:你不能在scala中获得等效的python id。