Как получить уникальный идентификатор для одного объекта в Java?

Я сделал векторный набор, чтобы избежать обхода GC с распределением итератора и т.п. (вы получаете новый/свободный каждый как для заданного задания, так и для заданного итератора для каждого обхода значений или ключей HashSet)

В любом случае, метод Object.hashCode() является уникальным идентификатором для каждого объекта. (не будет 64-разрядной версии?)

Но в любом случае он является переопределяемым и, следовательно, не гарантируется уникальным и уникальным экземпляром объекта.

Если я хочу создать "ObjectSet", как получить гарантированный уникальный идентификатор для каждого экземпляра объекта?

Я только что нашел это: на что он отвечает.

Как получить уникальный идентификатор объекта, который переопределяет hashCode()?

Ответ 1

java.lang.System.identityHashCode(obj); сделает это для вас, если вы действительно нуждаетесь в этом и понимаете последствия. Он получает идентификатор hashcode, даже если метод предоставления хэш-кода был переопределен.

Ответ 2

Простейшим решением является добавление поля к объекту. Это самое быстрое и эффективное решение и избегайте проблем с очисткой объектов.

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

Ответ 3

Нет, это не то, как работает hashCode(). Возвращаемое значение не обязательно должно быть уникальным. Точный контракт указан в документации .

Кроме того,

предположительно, метод Object.hashCode() является уникальным идентификатором для каждого объекта

неверно. Чтобы процитировать документацию:

Насколько это разумно практично, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов.

Ответ 4

Попытка превзойти java GC звучит как преждевременная оптимизация для меня.

GC уже настроен для обработки небольших короткоживущих объектов. Если у вас проблемы с производительностью с GC, вы должны помочь GC, а не повторять его (IMNSHO)