gpt4 book ai didi

java - java中有没有唯一标识对象的方法

转载 作者:行者123 更新时间:2023-11-30 06:26:20 29 4
gpt4 key购买 nike

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

Java object ID in jvm

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

最佳答案

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

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

保证哈希码是唯一的,只是实现试图使它们唯一。此外,按理说,如果将 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 }
}

关于java - java中有没有唯一标识对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14432501/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com