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

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

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

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

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

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

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

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

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

 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 registry = new IdentityHashMap(); 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); } 

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

也,

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

不是真的。 引用文档:

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

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

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