Saltar al contenido

Dirección de memoria de variables en Java

Solución:

Ese es el nombre de la 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 puede confiar en que sea algo.

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

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

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 :       [email protected]
Address: 0x7aae62270

Conclusión:

  • hashcode! = dirección
  • toString = [email protected](código hash)

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *