4

仮定する

Integer integerA = 500;

返された参照を印刷したいと思います。

4

7 に答える 7

4

オブジェクトへの参照を数値として取得するには、それをサポートする JVM で Unsafe を使用できます。参照を配列に配置し、32 ビット参照の場合は Unsafe.getInt() でアクセスできます (注: ほとんどの 64 ビット JVM は 32 ビット参照を使用します) または Unsafe.getLong() として参照にアクセスします。数値ですが、GC が発生してオブジェクトが移動された場合、取得するとすぐに変更される可能性があります。

もう 1 つの問題は、CompressedOops が、オブジェクトへのインデックスをさまざまな方法で変換できることを意味することです。シンプルにするために、4 GB から 26 GB のヒープを使用することをお勧めします。これらのサイズでは、アドレスをシフトしてアドレス<< 3を取得します。

ところで Unsafe.putInt(x, 1, hashCode) を使用して、システムの hashCode を上書きできます。;)

于 2013-08-03T10:21:18.403 に答える
2

人々は について答え続けますhashCode()hashCode()Integerは の値であるためInteger、メモリ内の位置とは関係ありません。さらに、一般に、2 つObjectsのファイルが同じhashCode()だからといって、それらが同じ を参照しているとは限りませObject

EDIT(コメントへの応答):オーバーライドされていないバージョンの を提供するIdentityHashCode()
を使用しても、メモリアドレスは取得されません。hashCode()

于 2013-08-03T08:21:36.233 に答える
1

Javaでオブジェクトの実際のメモリ位置を取得できるとは思いません(印刷目的またはその他の目的で)。実行してもSystem.out.println(new Object())、表示されるのは「参照」場所ではなく、オブジェクトのハッシュ コードを含む文字列です。

于 2013-08-03T08:12:49.123 に答える
0

toStringさまざまなクラスのデフォルトメソッドには、hashCodeメソッドの結果が含まれます。「参照を印刷する」ことに最も近いと思うので、おそらくあなたはそれを探しています。

于 2013-08-03T08:16:50.157 に答える
-1

デフォルトの実装(オーバーライドされていない場合)は、オブジェクトを次のように出力します

Integer i = 95;
System.out.println(i.getClass().getName() + "@" + Integer.toHexString(i.hashCode()));
//java.lang.Integer@5f

整数の場合、hashCode値は基になる値と同じです。

于 2013-08-03T08:15:44.717 に答える