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

pet*_*erk 14 java

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

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

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

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

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

如何获取覆盖hashCode()的对象的唯一ID?

Pet*_*rey 39

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

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

    public long getId() {
         return id;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您无法修改类,则可以使用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);
}
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 7

不,那不是hashCode()有效的.返回的值不必是唯一的.确切的合同在文件中有详细说明.

也,

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

不是真的.引用文档:

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


Chr*_*ett 6

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

  • 即使这已经有几个月了,但应该注意``System.identityHashCode(Object)`确实**不需要为不同的对象区分(如其他答案和注释中所述)! (15认同)