java中是否有唯一标识对象的方法

java中是否有唯一标识对象的方法,java,object,jvm,Java,Object,Jvm,我搜索了这些问题,但没有找到满意的答案 在Cpp/C++中,我可以使用对象地址检查两个对象的地址,以确定这两个对象是相同的,或者是不同的对象,但具有相同的值。 在python中,我可以使用id方法来获取每个对象id 在java中,是否有任何方法不需要重新实现hashCode()? 我想,根据JVM,下次可能会释放和回收对象,所以java中没有这样的方法?我说的对吗?答案是否定的。根据Object.hashCode API类对象定义的hashCode方法确实会为不同的对象返回不同的整数。即使Ob

我搜索了这些问题,但没有找到满意的答案

在Cpp/C++中,我可以使用对象地址检查两个对象的地址,以确定这两个对象是相同的,或者是不同的对象,但具有相同的值。 在python中,我可以使用id方法来获取每个对象id 在java中,是否有任何方法不需要重新实现
hashCode()

我想,根据JVM,下次可能会释放和回收对象,所以java中没有这样的方法?我说的对吗?

答案是否定的。根据Object.hashCode API
类对象定义的hashCode方法确实会为不同的对象返回不同的整数。即使Object.hashCode是基于对象地址的,它也不能保证唯一性,因为Java对象可以通过GC在堆上移动。

我不想在这里尝试答案,但需要更正。文件中的实际措辞为:

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

这并不能保证哈希代码是唯一的,只是实现试图使其唯一。此外,如果将64位物理地址(对于64位JVM)折叠为32位哈希值,则必然存在别名,实际上每个哈希值都有40亿个别名

JavaAPI特别避免访问物理地址,因为它希望允许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 }
}

我很确定Java中有一种方法。。我知道在Eclipse中你可以自动运行。生成ID?但是hashCode有什么好处?对于iD问题,它似乎是合法的。通常,您不必重新实现
hashCode()
——它可以“按原样”正常工作。除非你有一些非常奇怪的案例……:)Java的==进行标识比较。你能再澄清一下这个问题吗?你在文档中漏掉了关键词:“尽可能实际…”这意味着hashCode不一定是不同的。i、 e.顶部位从未设置。;)