Por favor, eche un vistazo a la imagen de abajo. Cuando creamos un objeto en java con la new
palabra clave, estamos obteniendo una dirección de memoria del sistema operativo.
Cuando escribimos out.println(objName)
podemos ver una cadena "especial" como salida. Mis preguntas son:
- ¿Cuál es esta salida?
Si es la dirección de memoria que nos ha proporcionado el sistema operativo:
a) ¿Cómo puedo convertir esta cadena a binario?
b) ¿Cómo puedo obtener una dirección de variables enteras?
Respuestas:
Ese es el nombre de clase y System.identityHashCode () separados por el carácter '@'. Lo que representa el código hash de identidad es específico de la implementación. A menudo es la dirección de memoria inicial del objeto, pero la máquina virtual puede mover el objeto en la memoria con el tiempo. Entonces (brevemente) no puedes confiar en que sea algo.
Obtener las direcciones de memoria de las variables no tiene sentido en Java, ya que la JVM es libre de implementar objetos y moverlos como parece (sus objetos pueden moverse durante la recolección de basura, etc.)
Integer.toBinaryString () le dará un número entero en forma binaria.
fuente
identityHashcode
no tiene sentido, simplemente no es infalible. :)Es posible usar
sun.misc.Unsafe
: vea esta gran respuesta de @Peter Lawrey -> ¿Hay alguna manera de obtener una dirección de referencia?Usando su código para printAddresses ():
Configuré esta prueba:
Aquí está la salida:
Conclusión
fuente
Esa es la salida de la implementación "toString ()" de Object. Si su clase anula aString (), imprimirá algo completamente diferente.
fuente
Esta no es la dirección de memoria Este es classname @ hashcode
dónde
nombre de clase = nombre completo calificado o nombre absoluto (es decir, nombre del paquete seguido del nombre de la clase)
hashcode = formato hexadecimal (System.identityHashCode (obj) u obj.hashCode () le dará un código hash en formato decimal)
fuente
Como dijo Sunil, esta no es una dirección de memoria . Es solo el código hash
Para obtener el mismo contenido @, puede:
Si hashCode no se anula en esa clase:
Si se anula hashCode, obtiene el valor original con:
Esto a menudo se confunde con la dirección de memoria porque si no anula hashCode (), la dirección de memoria se usa para calcular el hash.
fuente
Lo que está obteniendo es el resultado del método toString () de la clase Object o, más precisamente, el identityHashCode () como ha señalado uzay95.
"Cuando creamos un objeto en Java con una nueva palabra clave, estamos obteniendo una dirección de memoria del sistema operativo".
Es importante darse cuenta de que todo lo que hace en Java es manejado por la máquina virtual de Java. Es la JVM la que está dando esta información. Lo que realmente sucede en la RAM del sistema operativo host depende completamente de la implementación del JRE.
fuente
Esto es útil para saber sobre el código hash en Java:
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
fuente
En Java, cuando está creando un objeto de una clase como
Person p = new Person();
, enp
realidad es una dirección de una ubicación de memoria que apunta a un tipo dePerson
.Cuando use un statemenet para imprimir
p
, verá una dirección. Lanew
palabra clave crea una nueva ubicación de memoria que contiene todas las variables de instancia y métodos que se incluyenclass Person
yp
es la variable de referencia que apunta a esa ubicación de memoria.fuente