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