Por que o toString chamada de objeto () afetam a saída do cabeçalho do objeto? Eu estou usando o pacote jol

dengshuo:

código de L's é muito simples

public class L {
}

public class Synchronized1 {
    public static void main(String[] args) {
        L l=new L();
//       System.out.println(l.toString());
       System.out.println(ClassLayout.parseInstance(l).toPrintable());
    }
}

Descomentando, executar o código novamente irá resultar em resultados diferentes, ou dois resultados completamente diferentes. Eu quero saber qual é a causa desse resultado? Não apenas chamar toString () afeta o resultado, mas chamar outros métodos no objeto também afeta o resultado como hashCode ()

para sequenciar() Depois dos comentários

Mike Nakis:

Sua classe vazia class Lusa o padrão toString()herdado de class Object.

Os padrão toString()invoca hashCode().

E, como você já viu, hashCode()também parece afetar o cabeçalho do objeto.

So, in essence, the problem can be restated as "Why does calling hashCode() alter the header of my object?"

As others have already pointed in the comments, this is happening because in the particular JVM implementation that you are using, the hashCode of an object is computed the first time hashCode() is invoked, and then it is cached in the header, so that subsequent calls to hashCode() can just return the cached value, without having to re-compute it again.

Besides performance, there may be an even more important reason for doing this.

Dependendo de como o JVM que você está usando Calcula hashcodes, pode haver aleatoriedade envolvida nos cálculos, ou pode haver uma semente número cada vez incrementando, assim, pode ser que as tentativas posteriores para reproduzir o hashcode de um objeto que não têm meios de gerar o mesmo valor exacto como o primeiro cálculo. Isto significa que o primeiro cálculo deve determinar qual o valor hashcode será sempre depois.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=312748&siteId=1
Recomendado
Clasificación