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:
- ¿Qué es esta salida?
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.
esto es útil para saber sobre hashcode en java:
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
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