variable tipos enteras ejemplos declarar datos constantes java memory-management jvm hashcode memory-address

enteras - tipos de variables en java ejemplos



Dirección de memoria de variables en Java (9)

Como Sunil dijo, esto no es una dirección de memoria . Este es solo el código hash.

Para obtener el mismo contenido @, puede:

Si hashCode no se reemplaza en esa clase:

"@" + Integer.toHexString(obj.hashCode())

Si hashCode se reemplaza, obtienes el valor original con:

"@" + Integer.toHexString(System.identityHashCode(obj))

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.

Por favor, mira la imagen de abajo. Cuando creamos un objeto en Java con una palabra clave nueva, obtenemos una dirección de memoria del sistema operativo.

Cuando escribimos out.println(objName) podemos ver una cadena "especial" como salida. Mis preguntas son:

  1. ¿Qué es esta salida?
  2. Si es la dirección de memoria que nos da el sistema operativo:

    a) ¿Cómo puedo convertir esta cadena en binario?

    b) ¿Cómo puedo obtener una dirección de variables enteras?


En Java cuando haces un objeto de una clase como Person p = new Person(); , p es en realidad una dirección de una ubicación de memoria que apunta a un tipo de Person .

Cuando use un statemenet para imprimir p , verá una dirección. La new palabra clave crea una nueva ubicación de memoria que contiene todas las variables y métodos de instancia que se incluyen en la class Person y p es la variable de referencia que apunta a esa ubicación de memoria.


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 ():

public static void printAddresses(String label, Object... objects) { System.out.print(label + ": 0x"); long last = 0; int offset = unsafe.arrayBaseOffset(objects.getClass()); int scale = unsafe.arrayIndexScale(objects.getClass()); switch (scale) { case 4: long factor = is64bit ? 8 : 1; final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor; System.out.print(Long.toHexString(i1)); last = i1; for (int i = 1; i < objects.length; i++) { final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor; if (i2 > last) System.out.print(", +" + Long.toHexString(i2 - last)); else System.out.print(", -" + Long.toHexString( last - i2)); last = i2; } break; case 8: throw new AssertionError("Not supported"); } System.out.println(); }

Configuré esta prueba:

//hashcode System.out.println("Hashcode : "+myObject.hashCode()); System.out.println("Hashcode : "+System.identityHashCode(myObject)); System.out.println("Hashcode (HEX) : "+Integer.toHexString(myObject.hashCode())); //toString System.out.println("toString : "+String.valueOf(myObject)); printAddresses("Address", myObject);

Aquí está el resultado:

Hashcode : 125665513 Hashcode : 125665513 Hashcode (HEX) : 77d80e9 toString : java.lang.Object@77d80e9 Address: 0x7aae62270

Conclusión

  • hashcode! = dirección
  • toString = clase @ HEX (hashcode)

Esa es la salida de la implementación "toString ()" de Object. Si su clase anula toString (), imprimirá algo completamente diferente.


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 memoria a lo largo del tiempo. Entonces (brevemente) no puedes confiar en que sea nada.

Obtener las direcciones de memoria de las variables no tiene sentido en Java, ya que la JVM tiene la libertad de implementar objetos y moverlos como lo considere apropiado (sus objetos pueden / se moverán durante la recolección de basura, etc.)

Integer.toBinaryString() le dará un número entero en forma binaria.


Esto no es una dirección de memoria Esto es classname @ hashcode

dónde

classname = nombre calificado completo 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á hashcode en formato decimal)


Lo que está obteniendo es el resultado del método toString () de la clase Object o, más precisamente, el identityHashCode () como lo ha señalado uzay95.

"Cuando creamos un objeto en Java con una palabra clave nueva, obtenemos una dirección de memoria del SO".

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 sucede realmente en la memoria RAM del sistema operativo host depende completamente de la implementación del JRE.



toString () es una función en la biblioteca java.lang.Object, que devuelve la representación de la cadena de la referencia del objeto. El cuerpo de toString () es el siguiente

public String toString(Object arg) { return "fully_qualified_className@address"; }

aquí la dirección está dada por JVM no OS

Puede anular la función toString () proporcionando su propia implementación en el cuerpo de la función