Por favor, dê uma olhada na imagem abaixo. Quando criamos um objeto em java com a new
palavra - chave, estamos obtendo um endereço de memória do sistema operacional.
Quando escrevemos out.println(objName)
, podemos ver uma string "especial" como saída. Minhas perguntas são:
- O que é essa saída?
Se é o endereço de memória que nos foi dado pelo SO:
a) Como posso converter essa string para binária?
b) Como posso obter um endereço de variáveis inteiras?
Respostas:
Esse é o nome da classe e System.identityHashCode () separados pelo caractere '@'. O que o código de hash de identidade representa é específico da implementação. Geralmente, é o endereço de memória inicial do objeto, mas o objeto pode ser movido na memória pela VM ao longo do tempo. Então (brevemente) você não pode confiar que seja qualquer coisa.
Obter os endereços de memória das variáveis não faz sentido no Java, pois a JVM tem liberdade para implementar objetos e movê-los conforme parecer adequado (seus objetos podem / se moverão durante a coleta de lixo etc.)
Integer.toBinaryString () fornecerá um número inteiro em formato binário.
fonte
identityHashcode
, isso não tem sentido, apenas não é infalível. :)É possível usar
sun.misc.Unsafe
: veja esta ótima resposta de Peter Lawrey -> Existe uma maneira de obter um endereço de referência?Usando seu código para printAddresses ():
Eu configurei este teste:
Aqui está a saída:
Conclusão:
fonte
Essa é a saída da implementação "toString ()" do objeto. Se sua classe substituir toString (), ela imprimirá algo completamente diferente.
fonte
Este não é o endereço da memória Este é classname @ hashcode
Onde
nome da classe = nome completo qualificado ou nome absoluto (ou seja, nome do pacote seguido pelo nome da classe)
hashcode = formato hexadecimal (System.identityHashCode (obj) ou obj.hashCode () fornecerá código de hash no formato decimal)
fonte
Como Sunil disse, este não é um endereço de memória . Este é apenas o código hash
Para obter o mesmo conteúdo @, você pode:
Se o hashCode não for substituído nessa classe:
Se hashCode for substituído, você obterá o valor original com:
Isso geralmente é confundido com o endereço de memória, porque se você não substituir o hashCode (), o endereço de memória será usado para calcular o hash.
fonte
O que você está obtendo é o resultado do método toString () da classe Object ou, mais precisamente, o identityHashCode () como o uzay95 apontou.
"Quando criamos um objeto em java com a nova palavra-chave, estamos obtendo um endereço de memória do sistema operacional".
É importante perceber que tudo o que você faz em Java é tratado pela Java Virtual Machine. É a JVM que está fornecendo essas informações. O que realmente acontece na RAM do sistema operacional host depende inteiramente da implementação do JRE.
fonte
isso é útil para saber sobre hashcode em java:
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
fonte
Em Java, quando você cria um objeto de uma classe como
Person p = new Person();
,p
na verdade é um endereço de um local de memória que está apontando para um tipo dePerson
.Ao usar um conjunto de estatísticas para imprimir,
p
você verá um endereço. Anew
palavra-chave cria um novo local de memória que contém todas as variáveis e métodos de instância incluídosclass Person
ep
é a variável de referência que aponta para esse local de memória.fonte