Ответ 1
java.lang.System.identityHashCode(obj);
сделает это для вас, если вы действительно нуждаетесь в этом и понимаете последствия. Он получает идентификатор hashcode, даже если метод предоставления хэш-кода был переопределен.
Я сделал векторный набор, чтобы избежать обхода GC с распределением итератора и т.п. (вы получаете новый/свободный каждый как для заданного задания, так и для заданного итератора для каждого обхода значений или ключей HashSet)
В любом случае, метод Object.hashCode()
является уникальным идентификатором для каждого объекта. (не будет 64-разрядной версии?)
Но в любом случае он является переопределяемым и, следовательно, не гарантируется уникальным и уникальным экземпляром объекта.
Если я хочу создать "ObjectSet", как получить гарантированный уникальный идентификатор для каждого экземпляра объекта?
Я только что нашел это: на что он отвечает.
Как получить уникальный идентификатор объекта, который переопределяет hashCode()?
java.lang.System.identityHashCode(obj);
сделает это для вас, если вы действительно нуждаетесь в этом и понимаете последствия. Он получает идентификатор hashcode, даже если метод предоставления хэш-кода был переопределен.
Простейшим решением является добавление поля к объекту. Это самое быстрое и эффективное решение и избегайте проблем с очисткой объектов.
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);
}
Нет, это не то, как работает hashCode()
. Возвращаемое значение не обязательно должно быть уникальным. Точный контракт указан в документации .
Кроме того,
предположительно, метод Object.hashCode() является уникальным идентификатором для каждого объекта
неверно. Чтобы процитировать документацию:
Насколько это разумно практично, метод
hashCode
, определенный классомObject
, возвращает разные целые числа для разных объектов.
Попытка превзойти java GC звучит как преждевременная оптимизация для меня.
GC уже настроен для обработки небольших короткоживущих объектов. Если у вас проблемы с производительностью с GC, вы должны помочь GC, а не повторять его (IMNSHO)