如何在Java中为每个对象获取唯一ID?

时间:2012-01-20 08:22:22

标签: java

我制作了一个向量集,以避免使用迭代器分配等来破坏GC (对于HashSet的值或键的每次遍历,您为set引用和set迭代器获取new / free)

无论如何,Object.hashCode()方法应该是每个对象的唯一ID。 (对于64位版本会失败吗?)

但无论如何它都是可覆盖的,因此不能保证唯一,也不保证每个对象实例都是唯一的。

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

我刚刚发现了这个:它回答了它。

How to get the unique ID of an object which overrides hashCode()?

4 个答案:

答案 0 :(得分:39)

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

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

    public long getId() {
         return id;
    }
}

如果您无法修改该类,则可以使用IdentityHashMap,例如@ glowcoder的已删除解决方案。

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);
}

答案 1 :(得分:6)

不,这不是hashCode()的工作方式。返回的值不必是唯一的。确切的合同在documentation中列出。

此外,

  

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

不是真的。引用文档:

  

尽管合理可行,但是类hashCode定义的Object方法确实会为不同的对象返回不同的整数。

答案 2 :(得分:6)

java.lang.System.identityHashCode(obj);会为你做这件事,如果你真的需要它并理解其影响。它获取了身份哈希码,即使提供哈希码的方法已被覆盖。

答案 3 :(得分:3)

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

GC已经过调整以处理小型短期物体。如果你有GC的性能问题,你应该help the GC,而不是重新实现它(IMNSHO)