オブジェクトのメモリに割り当てられた実際のスペースを正確に知りたいです。
いくつかの例で説明しようとします.64ビットJVMを使用すると、ポインタサイズは8バイトになるはずです:
Object singletest = new Object();
オブジェクトを参照するには、オブジェクトのサイズに加えて 8 バイトが必要です。Object arraytest = new Object[10];
配列が格納されている位置を参照するために 8 バイト、配列を格納するために 8*10 バイト、および各オブジェクトのサイズが必要です。int singleint = new int;
int はプリミティブ型であるため、わずか 2 バイトで済みます。int[] arrayint = new int[10];
位置を参照するには 8 バイト、要素には 10*2 バイトが必要です。
さらに、これが Java で次のようなコードを記述できる理由です。
int[][] doublearray = new int[2][];
int[0][] = new int[5];
int[1][] = new int[10];
実際に起こることは、配列がオブジェクトのような参照 (別名ポインター) を生成するため、宣言時の 2 番目の次元のサイズは実際には問題になりません (次元は異なる場合があり、それらの間にリンクはありません)。次に、使用されるスペースは次のようになります: doublearrayへの参照(8 バイト)、最初の次元は単に 2 番目の次元への参照であるため、他の 8 バイト * 2 (最初の次元のサイズ)、そして最後に 2 バイト * 5 に 2 バイト * 10 を加えたものになります。 .
最後に、次のような実際のクラスがあるとします。
class Test {
int a, b;
int getA() {return A};
void setA(int a) {this.a = a;}
int getB() {return B};
void setB(int b) {this.b = b;}
}
インスタンス化するために new を呼び出すと、整数をクラスに格納するために 8 バイトのポインター (または Java であるため参照という名前) と 2 + 2 バイトが使用されます。
質問は次のとおりです。私は正しいですか、それともまったくナンセンスを書きましたか? さらに、オブジェクトをインスタンス化せずに宣言しただけの場合、8 バイトが割り当てられて使用されますか? null 値を代入するとどうなるでしょうか。
一方、プリミティブ型の場合、宣言するだけで要求されたスペースが割り当てられると確信しています(「int i」を宣言すると、参照が使用されず、メモリの一部だけが「0」に設定されるため、すぐに i++ を呼び出すことができます)。
私は巧妙な応答なしにインターネットで検索しました...私はたくさんの質問を書いたことを知っていますが、どんな助けも大歓迎です! (興味があるのは私だけではないかもしれません)