仮定する
Integer integerA = 500;
返された参照を印刷したいと思います。
オブジェクトへの参照を数値として取得するには、それをサポートする JVM で Unsafe を使用できます。参照を配列に配置し、32 ビット参照の場合は Unsafe.getInt() でアクセスできます (注: ほとんどの 64 ビット JVM は 32 ビット参照を使用します) または Unsafe.getLong() として参照にアクセスします。数値ですが、GC が発生してオブジェクトが移動された場合、取得するとすぐに変更される可能性があります。
もう 1 つの問題は、CompressedOops が、オブジェクトへのインデックスをさまざまな方法で変換できることを意味することです。シンプルにするために、4 GB から 26 GB のヒープを使用することをお勧めします。これらのサイズでは、アドレスをシフトしてアドレス<< 3
を取得します。
ところで Unsafe.putInt(x, 1, hashCode) を使用して、システムの hashCode を上書きできます。;)
人々は について答え続けますhashCode()
がhashCode()
、Integer
は の値であるためInteger
、メモリ内の位置とは関係ありません。さらに、一般に、2 つObjects
のファイルが同じhashCode()
だからといって、それらが同じ を参照しているとは限りませんObject
。
EDIT(コメントへの応答):オーバーライドされていないバージョンの を提供するIdentityHashCode()
を使用しても、メモリアドレスは取得されません。hashCode()
Javaでオブジェクトの実際のメモリ位置を取得できるとは思いません(印刷目的またはその他の目的で)。実行してもSystem.out.println(new Object())
、表示されるのは「参照」場所ではなく、オブジェクトのハッシュ コードを含む文字列です。
toString
さまざまなクラスのデフォルトメソッドには、hashCode
メソッドの結果が含まれます。「参照を印刷する」ことに最も近いと思うので、おそらくあなたはそれを探しています。
デフォルトの実装(オーバーライドされていない場合)は、オブジェクトを次のように出力します
Integer i = 95;
System.out.println(i.getClass().getName() + "@" + Integer.toHexString(i.hashCode()));
//java.lang.Integer@5f
整数の場合、hashCode
値は基になる値と同じです。