2012-01-20 31 views
9

Hice un conjunto de vectores para evitar agotar el GC con asignaciones de iterador y similares (obtiene un nuevo/libre para la referencia establecida y el iterador de conjunto para cada recorrido de los valores o claves de un HashSet)¿cómo obtengo un ID único por objeto en Java?

de todos modos supuestamente el método Object.hashCode() es una identificación única por objeto. (¿fallaría en una versión de 64 bits?)

Pero en cualquier caso es invalidable y, por lo tanto, no se garantiza único, ni único por instancia de objeto.

Si quiero crear un "ObjectSet" ¿cómo obtengo una identificación única garantizada para cada instancia de un objeto?

Acabo de encontrar esto: que lo responde.

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

+0

La pregunta no está clara. ¿Qué es exactamente lo que intenta lograr y por qué necesita una identificación única por objeto? – Paolo

+1

La descripción de lo que estás tratando de hacer es * realmente * vaga. ¿Podría dar más información? Es posible que haya una mejor manera de lograr su objetivo más grande. –

+0

Vi esta respuesta/questin que responde lo que quería. http: // stackoverflow.com/questions/909843/java-how-to-get-the-unique-id-of-an-object-which-overrides-hashcode – peterk

Respuesta

5

java.lang.System.identityHashCode(obj); lo hará por usted, si realmente lo necesita y entiende las repercusiones. Obtiene el código hash de identidad, incluso si el método para proporcionar el hashcode ha sido anulado.

+13

Incluso si ya tiene algunos meses, debe tenerse en cuenta que 'System.identityHashCode (Object)' no ** necesita ** ser distinto para objetos distintos (como ya se indicó en otras respuestas y comentarios). – siegi

+1

Solución dada allí (con algunas explicaciones y detalles): http://stackoverflow.com/questions/909843/java-how-to-get-the-unique-id-of-an-object-which-overrides-hashcode – Benj

+0

identityHashCode() devuelve el resultado del método hashCode() definido en Object. en javadoc para dicho método dice: "Tanto como sea razonablemente práctico, el método hashCode definido por la clase Object devuelve enteros distintos para distintos objetos. (Esto se implementa típicamente al convertir la dirección interna del objeto en un entero, pero esta técnica de implementación no es requerida por el lenguaje de programación JavaTM.) " –

5

No, no es así como hashCode() obras. El valor devuelto no tiene que ser único. El contrato exacto se detalla en el documentation.

También,

supuestamente el método Object.hashCode() es un identificador único por objeto

no es cierto. Para citar la documentación:

Tanto como sea razonablemente práctico, el método hashCode definido por clase Object no devolver enteros diferentes para objetos distintos.

+0

Lo sé, es por eso que hice la pregunta. – peterk

3

Tratando de superar el java GC suena como una optimización prematura para mí.

El GC ya está ajustado para manejar objetos pequeños de corta duración. Si tiene problemas de rendimiento con GC, debe help the GC, no volver a implementarlo (IMNSHO)

+1

Me encantaría que un GC determinista en tiempo real estuviera disponible como un complemento para máquinas virtuales java genéricas, donde podría garantizar que el GC consumiría más de 2 milisegundos en cada cuadro de un bucle de simulación de 60 hz. La reducción de las asignaciones y la libertad reduce la inevitable cantidad de puestos periódicos de GC. – peterk

32

La solución más simple es agregar un campo al objeto. Esta es la solución más rápida y eficiente y evita cualquier problema de objetos que no se limpian.

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

    public long getId() { 
     return id; 
    } 
} 

Si no puede modificar la clase, se puede utilizar un IdentityHashMap como @ glowcoder ha borrado solución.

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

¿El código anterior donde se agrega un campo al objeto garantiza una identificación única por instancia creada en la cara de los objetos creados a partir de múltiples subprocesos simultáneamente? – Geek

+0

@Geek Lo hará si usa un AtomicLong. –

Cuestiones relacionadas