私がする時:
int x[] = new int[2];
System.out.println("...> " + x);
出力値は次のようになります。[I@1b67f74
16進数は、オブジェクトが割り当てられたメモリアドレスに関係しているのでしょうか。
そして[I
それはどういう意味ですか?
私がする時:
int x[] = new int[2];
System.out.println("...> " + x);
出力値は次のようになります。[I@1b67f74
16進数は、オブジェクトが割り当てられたメモリアドレスに関係しているのでしょうか。
そして[I
それはどういう意味ですか?
いいえ、その16進数は、オブジェクトが配置されているメモリアドレスとして解釈されるべきではありません。実際、これはオブジェクトのハッシュコードです。のAPIドキュメントは次のようにObject.toString()
述べています。
クラスObjectのtoStringメソッドは、オブジェクトがインスタンスであるクラスの名前、アットマーク文字 `@'、およびオブジェクトのハッシュコードの符号なし16進表現で構成される文字列を返します。つまり、このメソッドは次の値に等しい文字列を返します。
getClass().getName() + '@' + Integer.toHexString(hashCode())
のAPIドキュメントは次のようにjava.lang.Object.hashCode()
述べています。
合理的に実用的である限り、クラスObjectによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJavaTMプログラミング言語では必要ありません。)
したがって、SunのJVMの場合、メソッドをオーバーライドしない場合hashCode()
、それは確かにオブジェクトのメモリアドレスですが、これがそうであるという保証はないので、それに依存するべきではありません。
純粋なJavaでオブジェクトのメモリアドレスを取得する(実際の、信頼できる)方法(任意のJVMで機能する)はありません。Javaにはポインターがなく、参照はポインターとまったく同じではありません。
Java仮想マシン仕様のセクション4.3.2[I
では、その意味について説明しています。この場合、変数がの配列であることを意味しますint
。
From: Java: "[B @ 1ef9157""の背後にある構文と意味?バイナリ/アドレス?
16進数は、オブジェクトIDまたはハッシュコードです。
[I
[
整数()の配列()であることを意味しI
ます。
[[Iはint配列のクラス名を表します。vm内のアドレスの番号ですが、hashCodeは通常オーバーライドされるため、オブジェクトを識別するために直接使用することは賢明ではありません。これには、信頼できる方法で同じ値を返すSystem.identityHashcode(Object x)を使用します。