Cuando una clase en Java no anula hashCode () , imprimir una instancia de esta clase da un buen número único.
El Javadoc de Object dice acerca de hashCode () :
Por mucho que sea razonablemente práctico, el método hashCode definido por la clase Object devuelve enteros distintos para objetos distintos.
Pero cuando la clase anula hashCode () , ¿cómo puedo obtener su número único?
Respuestas:
System.identityHashCode (yourObject) dará el código hash 'original' de yourObject como un entero. La unicidad no está necesariamente garantizada. La implementación de Sun JVM le dará un valor que está relacionado con la dirección de memoria original para este objeto, pero ese es un detalle de implementación y no debe confiar en él.
EDITAR: Respuesta modificada siguiendo el comentario de Tom a continuación re. direcciones de memoria y objetos en movimiento.
fuente
System.identityHashCode()
?El javadoc para Object especifica que
Si una clase anula hashCode, significa que quiere generar una identificación específica, que (se puede esperar) tendrá el comportamiento correcto.
Puede usar System.identityHashCode para obtener esa identificación para cualquier clase.
fuente
hashCode()
El método no es para proporcionar un identificador único para un objeto. Más bien digiere el estado del objeto (es decir, los valores de los campos miembros) a un solo entero. Este valor es utilizado principalmente por algunas estructuras de datos basadas en hash como mapas y conjuntos para almacenar y recuperar objetos de manera efectiva.Si necesita un identificador para sus objetos, le recomiendo que agregue su propio método en lugar de anularlo
hashCode
. Para este propósito, puede crear una interfaz base (o una clase abstracta) como a continuación.Ejemplo de uso:
fuente
¿Quizás esta solución rápida y sucia funcione?
Esto también proporciona el número de instancias de una clase que se inicializa.
fuente
System.identityHashCode
es una mejor soluciónAtomicLong
como en esta respuesta .Si es una clase que puede modificar, puede declarar una variable de clase
static java.util.concurrent.atomic.AtomicInteger nextInstanceId
. (Tendrá que darle un valor inicial de la manera obvia). Luego declare una variable de instanciaint instanceId = nextInstanceId.getAndIncrement()
.fuente
Se me ocurrió esta solución que funciona en mi caso donde tengo objetos creados en múltiples hilos y son serializables:
fuente
Si está buscando los
hashcode
tipos de Java cuando hace un.toString()
en un objeto, el código subyacente es este:fuente
Solo para aumentar las otras respuestas desde un ángulo diferente.
Si desea reutilizar los códigos hash de 'arriba' y derivar nuevos usando el estado inmutable de su clase, entonces una llamada a super funcionará. Si bien esto puede / puede no caer en cascada hasta el objeto (es decir, algunos antepasados pueden no llamar super), le permitirá obtener códigos hash mediante la reutilización.
fuente
Hay una diferencia entre los retornos hashCode () e identityHashCode (). Es posible que para dos objetos desiguales (probados con ==) o1, o2 hashCode () pueda ser el mismo. Vea el siguiente ejemplo de cómo esto es cierto.
fuente
Tuve el mismo problema y no estaba satisfecho con ninguna de las respuestas hasta ahora, ya que ninguna de ellas garantizaba identificaciones únicas.
Yo también quería imprimir ID de objeto para la depuración intencionada. Sabía que debía haber alguna forma de hacerlo, porque en el depurador de Eclipse, especifica ID únicos para cada objeto.
Se me ocurrió una solución basada en el hecho de que el operador "==" para objetos solo devuelve verdadero si los dos objetos son en realidad la misma instancia.
Creo que esto debería garantizar identificaciones únicas durante toda la vida del programa. Sin embargo, tenga en cuenta que probablemente no desee usar esto en una aplicación de producción porque mantiene referencias a todos los objetos para los que genera ID. Esto significa que cualquier objeto para el que cree una ID nunca se recolectará como basura.
Como estoy usando esto para propósitos de depuración, no estoy demasiado preocupado con la memoria liberada.
Puede modificar esto para permitir la eliminación de objetos o la eliminación de objetos individuales si le preocupa liberar memoria.
fuente