在java中是否有一个方法可以唯一地识别对象

时间:2013-01-21 04:22:33

标签: java object jvm

我搜索了问题,但没有找到任何满意的答案。

Java object ID in jvm

在Cpp / C ++中,我可以使用对象地址来检查两个对象地址,以确定两个对象是相同的,或者它是不同的对象但具有相同的值。 在python中,我可以使用id方法来获取每个对象ID 在java中,是否有任何方法不需要重新实现hashCode()来执行此操作? 我想根据JVM的说法,下次可能会释放和回收对象,所以java中没有这样的方法?我是对的吗?

2 个答案:

答案 0 :(得分:3)

我不打算在这里尝试答案,但需要进行修正。文档中的实际措辞是:

  

尽可能合理,类Object定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常是通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)

这提供了 no 保证,哈希码是唯一的,只有实现尝试使它们唯一。此外,如果将64位物理地址(对于64位JVM)折叠成32位散列值,则必须存在别名,实际上每个散列值有40亿个别名。

Java API特别避免了对物理地址的访问,因为它希望允许JVM使用复制收集器,其中对象的物理地址可以随时更改。

即使对于32位JVM,如果存在复制收集器并且在创建时从其地址计算对象的哈希值,则该对象被复制到不同的一代(通常发生),相同的哈希很可能是为在短暂(年轻)一代的同一个地方创建的另一个新对象计算的。

毫无疑问,由于性能开销,Java默认不提供唯一ID。使用静态计数器自己实现它们很简单,如果需要,可以在相应的构造函数中分配唯一ID。

interface ObjectWithUniqueId {
  public long getId();
}

class BaseObjectWithUniqueId implements ObjectWithUniqueId {
  private static long currentId = 0;
  private final long id;
  // TODO Synchronize me if we are in a multithreaded environment!
  public BaseObjectWithUniqueId() {  id = ++currentId; }
  public long getId() { return id }
}

答案 1 :(得分:2)

答案是否定的。根据Object.hashCode API the hashCode method defined by class Object does return distinct integers for distinct objects。如果甚至Object.hashCode基于对象地址,它也不能保证唯一性,因为可以通过GC在堆上移动Java对象。