如何在 Java 中获取每个对象的唯一 ID? [重复]

问题描述 投票:0回答:4

我创建了一个向量集,以避免迭代器分配等对 GC 造成影响 (对于每次遍历 HashSet 的值或键,您都会为集合引用和集合迭代器获得一个新的/免费的each)

无论如何,据说

Object.hashCode()
方法是每个对象的唯一ID。 (64 位版本会失败吗?)

但在任何情况下它都是可重写的,因此不能保证唯一,也不保证每个对象实例唯一。

如果我想创建一个“ObjectSet”,如何为对象的每个实例获得有保证的唯一 ID??

java
4个回答
46
投票

最简单的解决方案是向对象添加一个字段。这是最快、最有效的解决方案,可以避免任何对象无法清理的问题。

abstract Ided {
    static final AtomicLong NEXT_ID = new AtomicLong(0);
    final long id = NEXT_ID.getAndIncrement();

    public long getId() {
         return id;
    }
}

如果无法修改类,可以使用像@glowcoder删除的解决方案一样的IdentityHashMap。

private static final Map<Object, Long> registry = new IdentityHashMap<Object, Long>();
private static long nextId = 0;

public static long idFor(Object o) {
    Long l = registry.get(o);
    if (l == null)
        registry.put(o, l = nextId++);
    return l;
}

public static void remove(Object o) {
    registry.remove(o);
}

9
投票

不,

hashCode()
不是这样工作的。返回值不必是唯一的。确切的合同在文档中有详细说明。

还有,

据说Object.hashCode()方法是每个对象的唯一id

这不是真的。引用文档:

在合理实用的情况下,类

hashCode
定义的
Object
方法确实会为不同的对象返回不同的整数。


7
投票
如果您确实需要并了解其后果,

java.lang.System.identityHashCode(obj);
将为您做到这一点。即使提供哈希码的方法已被重写,它也会获取身份哈希码。


2
投票

对我来说,试图超越 java GC 听起来像是过早的优化。

GC 已经调整为可以处理小的短寿命对象。如果你有 GC 的性能问题,你应该帮助 GC,而不是重新实现它(IMNSHO)

© www.soinside.com 2019 - 2024. All rights reserved.