Pregunta

Normalmente, la implementación predeterminada de Object.hashCode() es una función de la dirección asignada del objeto en la memoria (aunque esto no es un mandato de la JLS ). Dado que las derivaciones VM objetos acerca de la memoria, ¿por qué el valor devuelto por System.identityHashCode() nunca cambian durante la vida del objeto?

Si se trata de un cálculo "one-shot" (hashCode del objeto se calcula una vez y escondido en la cabecera del objeto o algo así), entonces ¿significa que es posible que dos objetos que tienen el mismo identityHashCode ( si llegan a ser asignado por primera vez en la misma dirección en la memoria)?

¿Fue útil?

Solución

JVM modernos ahorran el valor en la cabecera del objeto. Creo que el valor se calcula normalmente sólo en el primer uso con el fin de mantener el tiempo de permanencia en la asignación de objeto a un mínimo (a veces hasta tan bajo como una docena de ciclos). El común JVM de Sun puede ser compilado para que el código hash de la identidad es siempre 1 para todos los objetos.

Varios objetos pueden tener el mismo código hash identidad. Esa es la naturaleza de los códigos hash.

Otros consejos

En respuesta a la segunda cuestión, con independencia de la aplicación, es posible que varios objetos tengan la misma identityHashCode.

error 6321873 para una breve discusión sobre la redacción de la Javadoc, y un programa para demostrar la no unicidad.

La cabecera de un objeto en HotSpot consiste en un puntero de clase y una palabra "marca".

El código fuente de la estructura de datos para la palabra marca se puede encontrar la markOop.hpp archivo. En este archivo hay una capa de memoria que describe comentario de la marca:

  

hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)

Aquí podemos ver que el código hash de la identidad para Java normal de objetos en un sistema de 32 bits se guarda en la marca y es de 25 bits de longitud.

La pauta general para la aplicación de una función hash es:

  • el mismo objeto debe devolver un hashCode consistente , no debe cambiar con el tiempo o depender de cualquier información variable (por ejemplo, un algoritmo de sembrado por un número o valores de los campos miembro mutable azar
  • la función hash debe tener un buena distribución al azar , y con esto quiero decir que si se tiene en cuenta el código hash como cubos, 2 objetos deben asignarse a diferentes cubos (hashcodes) en la medida de lo posible. La posibilidad de que los objetos 2 tendría el mismo código hash debe ser raro - a pesar de que puede suceder.

Por lo que yo sé, esto se implementa para devolver la referencia, que nunca va a cambiar en la vida objetos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top